[전문가를 위한 C++] C++ 표준 라이브러리 둘러보기
‘전문가를 위한 C++ - Marc Gregoire 지음, 남기혁 옮김’ 책을 참고하여 작성한 포스트입니다.
코드 작성 원칙
- 템플릿 활용
- 템플릿을 활용해 제너릭 프로그래밍(generic programming)을 할 수 있다.
- 제너릭 프로그래밍이란 모든 종류의 객체를 다루고, 코드 작성 시점에 모르던 객체도 처리할 수 있다.
- 연산자 오버로딩 활용
c++ 표준 라이브러리 둘러보기
스트링
string
에 정의되어 있다.- c 스타일 문자 배열에 비해 메모리 관리, 스트링 결합 등의 다양한 기능이 있어 스트링을 사용하는 것이 좋다.
<string_view>
에 정의 되어 있는string_view
클래스는 스트링을 읽기 전용으로 표현해const string&
대신 사용 가능하고, 스트링을 복제하지 않아 오버헤드도 발생하지 않는다.- c++20 부터는
format()
사용이 가능하다.
정규 표현식(regular expression)
<regex>
에 정의되어 있다.- 텍스트의 패턴 매칭(pattern matching) 구현에 유용하다.
I/O 스트림(stream)
- 입출력에 대한 모델
스마트 포인터
<memory>
에 스마트 포인터들이 정의되어 있다.
익셉션(exception)
수학 연산 관련 유틸리티
<cmath>
에 정의되어 있다.<numeric>
에는 최대 공약수(gcd), 최소 공배수(lcm) 을 계산하는gcd()
,lcm()
이 정의되어 있다.- c++20 에 많은 기능들이 추가되었다.(나중에 추가)
시간과 날짜 관련 유틸리티
무작위수(23장)
초기자 리스트
패어와 튜플(24장)
<utility>
에 정의된 pair 클래스 템플릿은 타입이 서로 다른 두 원소를 하나로 묶어 저장할 수 있다.<tuple>
에 정의된 tuple은 pair를 일반화 한 것이다.
어휘 타입(vocabulary type)
- optional, variant(24장), any(24장) 등
함수 객체(function object)
- 함수 호출 연산자를 구현하는 클래스이다.
<functional>
에 정의되어 있다. (19장)
파일 시스템
멀티스레딩(27장)
타입 트레이트(type traits)(26장)
표준 정수 타입
표준 라이브러리 기능 테스트 매크로(c++20)
(C++20)
소스 위치 (c++20)
컨테이너(container) (18장에서 더 자세히)
- 정보를 원소 단위로 저장한다.
- 표준 라이브러리에서 제공하는 컨테이너는 모두 클래스 템플릿이고, 동형 컨테이너(원소 모두 타입이 같음)다.
- set, map 은 원소를 정렬된 상태로 유지한다.
- unordered_set, unordered_map 은 비정렬 상태 유지한다
vector를 기본 컨테이너로 사용하는 것이 좋다. list나 forward_list 보다 추가나 삭제 연산이 훨신 빠른데, 최신 CPU에서 메모리와 캐시를 처리하는 방식 때문이기도 하고, 두 리스트는 추가나 삭제할 지점까지 탐색하는 오버헤드가 있기 때문이다. 같은 메모리 공간에 없으면 반복문의 성능도 떨어진다.
알고리즘(algorithm) (20장에서 더 자세히)
- 정렬이나 탐색과 같은 특정한 작업을 처리하는 전략을 말한다.
- 표준 라이브러리의 알고리즘은 함수 템플릿으로 구현되어 있어 다양한 타입의 컨테이너에 적용 가능하다.
- 대부분
<algorithm>
에 정의되어 있다. - 원소를 순차적으로 처리하는 알고리즘은 항상 반복자를 지원한다.
불변형 순차 알고리즘(non-modifying sequence algorithm)
- 원소의 값이나 순서를 변경하지 않는다.
- 크게 세 가지로 나뉘는데,
- 탐색 알고리즘(search algorithm)
- 비교 알고리즘(comparison algorithm)
- 집계 알고리즘(counting algorithm)
가변형 순차 알고리즘(modifying sequence algorithm)
- 시퀀스의 모든 원소나 일부 원소를 수정하는 알고리즘
작업 알고리즘(operational algorithm)
- 시퀀스의 원소마다 함수를 실행한다.
교환 알고리즘(swap/exchange algorithm)
- 두 원소 또는 시퀀스를 맞바꾼다
분할 알고리즘(partition algorithm)
- 주어진 조건식에 참을 리턴하는 원소가 거짓을 리턴하는 원소보다 앞에 있으면 거짓을 리턴하는 원소를 분할 지점(partition point)이라 하고 그 지점에서 시퀀스를 분할한다.
정렬 알고리즘(sorting algorithm)
이진 탐색 알고리즘(binary search algorithm)
- 정렬된 시퀀스에 적용된다.
- 대상 시퀀스가 최소한 탐색할 원소를 기준으로 분할된 상태여야 한다.
집합 알고리즘(set algorithm)
- 시퀀스에 대해 집합 연산을 수행하는 가변 알고리즘(modifying algorithm)이다.
힙 알고리즘(heap algorithm)
- priority_queue 구현 시 힙 사용
최대/최소 알고리즘
- clamp(), min(), max(), minmax() 등..
수치 처리 알고리즘(nuemrical processing algorithm)
<numeric>
에 정의되어 있다.- 정렬되지 않은 시퀀스에대해 적용 가능하며 선형 복잡도의 성능을 낸다.
- accuumulate(), 등
순열 알고리즘(permutation algorithm)
- is_permutation(), next_permutation(), prev_permutation() 등
범위 알고리즘(range algorithm) (C++20)
<ranges>
에 정의되어 있다.(17장)
##
Leave a comment