상위 문서: C++
1. 개요
1.1. Standard Library와 STL
2. 구성2.1. 환경2.2. 메타 프로그래밍2.3. 리플렉션2.4. 오류 처리2.5. 숫자2.6. 문자열2.7. 컨테이너
3. 여담4. 구현체5. 외부 링크2.7.1. <vector>2.7.2. <bitset>2.7.3. <deque>2.7.4. <list>2.7.5. <set>2.7.6. <map>2.7.7. <array>2.7.8. <forward_list>2.7.9. <unordered_set>2.7.10. <unordered_map>
2.8. 컨테이너 어댑터2.9. 순회자2.9.1. <iterator>
2.10. 알고리즘2.11. 범위2.12. 입/출력2.12.1. <iostream>2.12.2. <iomanip>2.12.3. <strstream>2.12.4. <sstream>2.12.5. <fstream>2.12.6. <syncstream>2.12.7. <print>
2.13. 유틸리티2.13.1. <utility>2.13.2. <functional>2.13.3. <initializer_list>2.13.4. <compare>2.13.5. 컨테이너2.13.6. <random>2.13.7. <chrono>2.13.8. <locale>2.13.9. <filesystem>
2.14. 저수준 메모리 제어2.14.1. <new>2.14.2. <memory>
2.15. 병렬성2.14.2.1. 스마트 포인터 (Smart Pointer)2.14.2.2. 참조 횟수 세기 포인터 (std::shared_ptr)2.14.2.3. 배타적 소유 포인터 (std::unique_ptr)
2.14.3. <scoped_allocator>2.14.4. <memory_resource>1. 개요
C++ Standard LibraryC++의 기능 명세와 명세를 구현한 라이브러리에 대해 설명하는 문서.
1.1. Standard Library와 STL
C++의 언어 표준 명세와 이를 제정한 표준 라이브러리로서 본래 표준과는 독립적이었던 STL Standard Template Library 와는 다른 물건이다. STL은 여러 유명한 프로그래머의 강연이나 저자물에서 용어를 각기 다르게 사용해서 널리 오해되고 잘못 사용되는 용어이다.[1]STL을 만든 Alexander Stepanov 는 일반화 프로그래밍 기법에 대한 연구를 했었다. 이 과정에서 자료형에 부여받지 않는 자료구조와 알고리즘을 사용하는 일반화 프로그래밍(Generic programming) 개념을 구현하기 위해 개발되었다. 이는 특정 언어와 관련있는 연구는 아니었지만 C++ (1983)에 영향을 주어 STL의 시초를 만들게 되었다. 연구의 결과물인 STL 구현체가 1993년에 C++ 표준안 제정 위원회[2]에 처음 제출되면서 C++과 인연을 맺게 되었고 Meng Lee와 David Musser가 추가로 협력하여 개선한 STL 구현체가 1994년에 C++ 표준으로 승인되었다. 특히 gcc에 내장된 구현체 libstdc++와 Clang에 내장된 구현체인 libc++에 지대한 영향을 끼쳤다.
현재의 C++ standard library가 Stephanov, Lee, Musser가 90년대에 개발한 Standard Template Library(STL)의 아이디어를 많이 수용한 것은 사실이나, C++ 표준 라이브러리와 STL은 서로간의 슈퍼셋도 서브셋도 아니다. C++ 표준안 그 어디에도 STL이라는 표현은 등장하지 않음에도 불구하고 Effective C++의 저자인 Scott Meyers와 같은 거장 프로그래머들이 90년대의 관습 그대로 STL이라는 용어를 자신의 저작물에 지속적으로 사용하는 바람에 STL이라는 용어가 아직도 널리 사용되고 있으며 STL과 C++ standard library의 차이가 뭔지 묻는 수많은 구글 검색 결과가 보여주듯이 초보자들에게 꽤 커다란 혼돈을 주는 요소이다.
2024년 시점에서 초창기 STL의 구현체는 모두 사라지고 그 아이디어만이 살아남아서 C++ Standard Library에 흡수되었으므로 STL이라고 구분지어 표현하는 것은 이상한 것이 맞겠지만, 요즘에도 특정 컨테이너나 예외 부분 같은 것을 STL이라고 부르는 것은 여전하다.
2. 구성
===# 전체 모듈 목록 #===|C++ 표준 라이브러리|<table width=90%><tablealign=center><tablebordercolor=#030303,#eeeeee><nopad>
||<:><width=23%>분류||<-2>이름||
||2.1. 환경
2.1.1. <cstddef>
std :: size_t |
표준 라이브러리에서 크기를 나타내기 위해 사용하는 부호없는 정수형의 자료형 별칭. 자세한 내용은 size_t 참조. |
std :: ptrdiff_t |
표준 라이브러리에서 주소의 차이를 표현하기 위해 사용하는 부호가 있는 정수형의 자료형 별칭. |
nullptr | C++11 |
0의 주소를 가리키는 포인터를 나타내는 상수. |
std :: nullptr_t | C++11 |
항상 0의 주소를 가리키는 포인터의 고유한 자료형. decltype(nullptr) 로 정의된다. |
std :: max_align_t | C++11 |
현재 운영체제에서 메모리를 정렬할 수 있는 최대 크기를 가진 자료형의 별칭. 64비트 시스템에서는 보통 std::int64_t 다. |
enum class std :: byte | C++17 |
운영체제에 상관없이 1바이트의 크기를 가지는 열거형. 아무런 열거자 멤버를 가지고 있지 않다. C++17부터는 열거형에 임의의 값을 넣을 수 있기 때문에 1 바이트를 표현할 수 있도록 고안되었다. |
2.1.2. <cstdlib>
NULL
std::div_t
,std::ldiv_t
,std::lldiv_t
,std::size_t
std::malloc()
,std::calloc()
,std::realloc()
,std::free()
std::rand()
,std::srand()
std::qsort()
,std::bsearch()
std::abort()
,std::exit()
,std::atexit()
std::getenv()
,std::system()
std::quick_exit()
C++11 ,std::at_quick_exit()
C++11std::aligned_alloc()
C++17
2.1.3. <version>
2.1.4. <debugging>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
debugging
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 디버그 관련 도구를 제공하는 모듈. |
현재 디버그 문맥인지 여부를 반환하는 함수. |
2.1.5. <text_encoding>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
text_encoding
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 현재 콘솔 환경에서 텍스트 인코딩을 확인하는 기능을 제공하는 모듈. |
class
std::text_encoding
enum class
std::text_encoding::id
2.2. 메타 프로그래밍
2.2.1. <type_traits>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
type_traits
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 자료형에 대한 컴파일 시점 연산 및 기술 방법을 제공하는 모듈. |
2.2.2. <concepts>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
concepts
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 제약조건 모듈. |
자세한 내용은 C++/표준 라이브러리/concepts 문서 참고하십시오.
2.3. 리플렉션
2.3.1. <typeinfo>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
typeinfo
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 런타임에 자료형에 대한 메타 정보를 가져올 수 있는 모듈. |
class
std::type_info
typeid()
: 자료형에 관한 정보를 가져오는 연산자.std::type_info
의 인스턴스를 반환한다. [3]
2.3.2. <typeindex>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
typeinfo
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 런타임에 자료형에 대한 메타 정보를 가져올 수 있는 모듈. |
C++11
class
std::type_index
: 상기한std::type_info
를 비교하거나 연관 컨테이너에서 이용하기 위해 래핑하는 클래스
2.3.3. <source_location>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
source_location
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 현재 실행되는 문맥의 정보를 확인하는 기능을 제공하는 모듈. |
class
std::source_location
: C언어에서 수십년간 이용되던 매크로를 대체하여, 현재 소스 파일의 내용과 메타 정보를 접근할 수 있게 도와주는 클래스. 이를 위해static consteval
멤버 함수를 가지고 있다.
2.3.4. <stacktrace>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
stacktrace
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 현재 실행 스택을 확인할 수 있는 인터페이스를 제공하는 모듈. |
class
std::stacktrace_entry
: 함수 실행 스택의 정보를 저장하는 클래스. 단일 클래스로는 아무것도 못하고 후술할std::basic_stacktrace
에서 가져와야 한다.class
std::basic_stacktrace<Allocator>
: 현재 함수의 실행 스택을 목록으로 저장하고 볼 수도 있는 클래스. [4]
2.4. 오류 처리
2.4.1. <exception>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
exception
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 예외 구현 클래스와 예외 관련 유틸리티를 제공하는 모듈. |
class
std::exception
: 모든 예외의 부모 클래스.class
std::bad_exception
: 모든 나쁜 예외의 부모 클래스.
2.4.2. <stdexcept>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
stdexcept
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 특수한 목적을 위해 파생된 예외 클래스들을 제공하는 모듈. |
class
std::nested_exception
: 중첩해서 던져진 예외를 처리하는 클래스class
std::logic_error
,std::invalid_argument
,std::overflow_error
등std::exception
의 특수화 클래스를 제공.
2.4.3. <system_error>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
system_error
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 사용자의 운영체제에 특화된 예외 처리를 지원하는 모듈. |
enum class
std::errc
: POSIX 인터페이스를 이용하는 범용 운영체제에서 발생하는 오류의 코드 목록. C언어의errno
와 관련한 전처리기 상수들을 대체할 수 있다.class
std::error_category
: 범용 운영체제에서 발생하는 오류를 분류하거나, 발생한 오류 코드의 정보를 찾아볼 수 있는 클래스. 운영체제 특화보다는 C++ 표준에 알맞게 오류를 구분하고 있다.class
std::system_error
: 현재 운영체제에서 발생한 오류 코드와 내용을 보여주는 클래스. 가령 특정 운영체제의 스레드나 네트워크 소켓에서 오류가 발생하면 그 오류는 C++ 표준에는 없겠지만,try { ... } catch (std::system_error)
를 이용할 수 있다면 현재 운영체제에 맞는 오류를 알아낼 수 있다. 이 클래스에서는std::errc
와std::error_category
를 멤버 함수를 통해 접근할 수 있다.class
std::error_code
: 현재 운영체제에서 발생한 오류에 관련된 부호를 저장하는 클래스. 이 클래스 역시도std::errc
와std::error_category
를 멤버 함수를 통해 접근할 수 있다. 보통 이 부호는enum class
std::errc
와 똑같은 값인, 오류의 종류를 나타내는 숫자이다. 그러나 심지어는 내부 오류 객체에 대한 포인터나 핸들일 수도 있다. 때문에 고유한 부호가 아니라서 똑같은 숫자라도 현재std::error_category
에 따라 의미가 달라질 수 있다.
2.4.4. <expected>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
expected
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 성공한 결과와 실패한 결과를 구분하는 기능을 제공하는 모듈. |
2.5. 숫자
2.5.1. 연산
2.5.1.1. <cmath>
2.5.1.2. <complex>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
complex
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 복소수 연산 및 수학 함수의 오버로딩을 제공하는 모듈. |
class
std::complex
: 복소수 클래스.
2.5.1.3. <bit>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
bit
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 단일 숫자의 비트를 조작하는 연산을 제공하는 모듈. |
bit_cast()
: 이 모듈의 핵심 함수로써 숫자의 변환을 메모리의 내용을 그대로 복사한다. 가령float 6.01f
를int
로 바꾸면 원래는 6이 되겠지만,bit_cast
의 결과는 그렇지 않다. 다시 말하면 float 변수를 reinterpret_cast<const char*>로 변환하고 int 변수의 주소에 memcpy를 한것과 똑같이 동작한다. 그런데 이 함수는 결정론적인 수행이 가능하다.
2.5.1.4. <linalg>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
linalg
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 선형 대수 연산을 제공하는 모듈. |
2.5.2. 메타
2.5.2.1. <limits>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
limits
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 숫자에 대한 메타 정보를 기술하고\ |
* class std::numeric_limits: 숫자 자료형의 최대값, 최소값 등 정보를 기술하는 메타 클래스.
2.5.2.2. <numbers>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
numbers
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | std::numbers::pi\ |
2.6. 문자열
2.6.1. <string>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
string
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 문자열 클래스와 문자열 변환 함수들을 제공하는 모듈. |
class
std::string
: 동적 할당된 문자열 클래스.
2.6.2. <regex>
2.6.3. <string_view>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
string_view
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 읽기 전용 문자열 클래스를 제공하는 모듈 |
class
std::string_view
: C 방식의 문자열 또는std::string
을 참조하는 읽기 전용 클래스.
2.6.4. <charconv>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
charconv
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 자명한 자료형과 문자열 사이에 서로 변환하는 기능을 제공하는 모듈 |
enum class
std::chars_format
: 숫자를 변환할 규칙을 나열한 열거형std::from_chars()
: 문자열을 읽어 숫자로 변환하는 함수. T는 정수, 부동소수점 모두 가능하다.std::to_chars()
: 숫자를 문자열로 변환하여 문자열 범위에 쓰는 함수. T는 정수, 부동소수점 모두 가능하다.
2.6.5. <format>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
format
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 일정한 규칙을 가진 문자열을 통한 일련의 값들의 문자열 형식화 기능을 제공하는 모듈. |
2.7. 컨테이너
어떤 자료를 저장할 수 있는 템플릿 클래스의 집합으로써 아직 때때로 STL이라고 칭해지는 명세다.템플릿을 이용해서 일반화 프로그래밍을 잘 구현하고 있으며, 대개 어떤 자료형에든 적용할 수 있다. 구현하고자 하는 동작에서 가장 오버헤드가 걸릴 것으로 생각되는 부분을 고려하여 컨테이너를 선택하면 성능 향상에 도움이 된다. 한편 사용자 정의 클래스의 경우
std::vector<T>
와 같이 정의하면 바로 사용할 수 있는 경우도 있는 반면, 자료에 대한 연산을 위해 별도의 함수를 정의해 주어야 하는 경우도 있다. 맵과 같이 고유한 키 값을 써서 정렬이나 연산을 하는 경우를 예로 들 수 있다. 특히 std::map, std::unordered_map
계열이 대표적이다.2.7.1. <vector>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
vector
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 메모리의 맨 끝부분으로 삽입/삭제가 이루어지는 동적 배열 클래스 std::vector를 제공하는 모듈. |
class std :: vector < T \ allocator > ; | |
<colcolor=#a8a8a8,#a1a1a1>이름이 다소 이상하게 붙어 있지만 개념적으로는 크기가 자동으로 동적 할당되는 배열이며 연산자 오버로딩 덕분에 C언어의 배열과 거의 비슷하게 사용할 수 있다.
| |
constexpr void push_back ( const T & item ) ; | |
constexpr void push_back ( T && item ) ; | C++11 |
요소를 인자로 받아 벡터의 맨 뒤쪽에 하나 추가한다. | |
constexpr void append_range ( container-compatible-range < T > Range && range ) ; | C++23 |
지정한 범위를 벡터의 맨 뒤쪽에 연달아 추가한다. | |
constexpr void pop_back ( ) ; | |
벡터의 맨 뒤쪽에 있는 요소를 하나 제거한다. | |
constexpr void insert ( const_iterator pos , const T & item ) ; | |
constexpr void insert ( const_iterator pos , T && item ) ; | C++11 |
지정한 순회자의 뒤쪽에 요소를 하나 추가한다. const_iterator 는 해당 벡터의 순회자만 사용할 수 있다. | |
constexpr void insert ( const_iterator pos , size_type count , const T & copy_item ) ; | |
constexpr void insert ( const_iterator pos , InputIterator first , InputIterator last ) ; | |
constexpr void insert ( const_iterator pos , initializer_list list ) ; | |
constexpr void insert_range ( const_iterator pos , container-compatible-range < T > Range && range ) ; | C++23 |
지정한 순회자의 뒤쪽에 요소를 여러개 연달아 추가한다. const_iterator 는 해당 벡터의 순회자만 사용할 수 있다. | |
constexpr void erase ( iterator pos ) ; | |
constexpr void erase ( const_iterator pos ) ; | |
constexpr void erase ( iterator first , iterator item ) ; | |
constexpr void erase ( const_iterator first , const_iterator item ) ; | |
지정한 순회자 혹은 순회자 범위 내의 요소를 모두 삭제한다. 그러나 할당된 메모리 공간은 줄이지 않는다. | |
constexpr void clear ( ) ; | |
벡터의 요소를 모두 삭제한다. 그러나 할당된 메모리 공간은 줄이지 않는다. | |
벡터의 크기를 부호없는 정수형으로 반환한다. | |
벡터가 비어있는지 아닌지 여부를 반환한다. |
2.7.2. <bitset>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
bitset
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
class
std::bitset
: 비트 묶음을 표현하는 클래스. 1비트에서 다중 비트까지 다양한 연산을 지원한다. 문자열, 32비트 숫자, 64비트 숫자로 변환도 지원한다.
2.7.3. <deque>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
deque
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 메모리의 양방향으로 삽입/삭제가 이루어지는 동적 배열 클래스 std::deque를 제공하는 모듈. |
class
std::deque
: 앞/끝 모두에서 O(1)로 삽입/삭제가 가능하지만std::vector
와는 달리 메모리 상에서 연속적인 공간으로 할당되지는 않는다.
2.7.4. <list>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
list
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 양방향 연결 리스트 클래스 std::list를 제공하는 모듈. |
class
std::list
: 양방향 연결 리스트 클래스. 임의 위치 참조 불가, 검색 O(n), 대신 위치를 알고 있는 경우 어느 위치에서나 삽입/삭제 O(1). 이러한 특성상 한 개씩 스캐닝하면서 빈번히 삽입/삭제를 해야 하는 경우에 유용하다.
2.7.5. <set>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
set
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 집합 클래스 std::set와 std::multiset을 제공하는 모듈. |
class
std::set
,std::multiset
: 정렬이 가능한 객체들을 담기 위한 container로 삽입 시점부터 정렬된 상태로 저장된다. 구현은 대개의 경우(사용가능한 범위 내에서는 전부라고 해도 무방할 정도로) red-black tree를 이용한다. 삽입/검색/삭제 O(log n).std::set
의 경우는 정렬 시 사용되는 값이 유일해야 하며,std::multiset
의 경우는 그렇지 않고, 같은 값인 경우 삽입된 순서가 유지된다.
2.7.6. <map>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
map
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 사상 클래스 std::map과 std::multimap을 제공하는 모듈. |
class
std::map
,std::multimap
:std::set
과 거의 비슷하나 그냥 객체만 저장하는 것이 아니라 정렬이 가능한 key와 그 key가 가리키는 객체의 pair로 저장된다.std::map
은 key가 유일해야 하며,std::multimap
의 경우는 그렇지 않고, 같은 경우 삽입된 순서가 유지된다.
2.7.7. <array>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
array
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 정적 배열 클래스 std::array를 제공하는 모듈. |
class
std::array
: 크기가 고정된 정적 배열을 추상화한 클래스.
2.7.8. <forward_list>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
forward_list
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 단방향 연결 리스트 클래스 std::forward_list를 제공하는 모듈. |
class
std::forward_list
: 전방위 단방향 연결 리스트 클래스.
2.7.9. <unordered_set>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
unordered_set
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 해시 기반의 집합 컨테이너 클래스 std::unordered_set과 std::unordered_multiste을 제공하는 모듈 |
class
std::unordered_set
,std::unordered_multiset
:std::set
,std::multiset
과 같은 동작을 하지만 red-black tree 대신 hash로 구현된다. 그래서 삽입된 값이 정렬되지 않으며 시간복잡도도 hash의 특성을 따른다. 삽입/검색/삭제는 평균적으로 O(1), 최악의 경우 O(n).
2.7.10. <unordered_map>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
unordered_map
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 해시 기반의 연관 컨테이너 클래스 std::unordered_map과 std::unordered_multimap을 제공하는 모듈 |
class
std::unordered_map
,std::unordered_multimap
:std::set
,std::multiset
,std::map
,std::multimap
과 같은 동작을 하지만 red-black tree 대신 hash로 구현된다. 그래서 삽입된 값이 정렬되지 않으며 시간복잡도도 hash의 특성을 따른다. 삽입/검색/삭제는 평균적으로 O(1), 최악의 경우 O(n).
2.8. 컨테이너 어댑터
2.8.1. <stack>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
stack
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 컨테이너 어댑터에 속하며 컨테이너는 아니다. |
class
std::stack
: 위의 컨테이너들을 이용하여 구현된 스택 클래스
2.8.2. <queue>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
queue
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 컨테이너 어댑터에 속하며 컨테이너는 아니다. |
class
std::queue
: 위의 컨테이너들을 이용하여 구현된 큐 클래스.class
std::priority_queue
: 위의 컨테이너들을 이용하여 구현된 우선순위 큐 클래스.
2.8.3. <flat_set>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
flat_set
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 컨테이너 어댑터에 속하며 컨테이너는 아니다. |
class
std::flat_set
2.8.4. <flat_map>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
flat_map
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 컨테이너 어댑터에 속하며 컨테이너는 아니다. |
class
std::flat_map
2.9. 순회자
2.9.1. <iterator>
컨테이너의 원소를 순회하는 방법을 추상화한 명세.- forward_iterator_tag
- reverse_iterator_tag
- insert_iterator_tag
- input_iterator_tag
- output_iterator_tag
- bidirectional_iterator
- random_iterator_tag
2.10. 알고리즘
2.10.1. <algorithm>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
algorithm
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 자료구조의 반복자를 통해 범위 기반의 알고리즘을 실행하는 템플릿 함수들을 제공하는 모듈. |
for_each()
transform()
generate()
find()
binary_search()
stable_sort()
sort()
std::for_each()
같은 것을 예로 들 수 있다.2.10.2. <numeric>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
numeric
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 자료구조의 반복자를 통해 숫자와 관련된 알고리즘을 실행하는 템플릿 함수들을 제공하는 모듈. |
2.10.3. <execution>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
execution
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
C++17에서는 드디어 알고리즘들이 병렬 실행을 지원하기로 하였다. 알고리즘 호출 시에
std::execution::sequenced_policy
, std::execution::parallel_policy
, std::execution::parallel_unsequenced_policy
를 선택할 수 있다. 2019년 6월 현재 GCC 9와 MSVC 2017, Intel C++ 컴파일러가 이를 지원한다. LLVM/Clang의 경우 아직 지원하지 않는다.2.11. 범위
2.11.1. <span>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
span
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
class
std::span
: 연속된 메모리 공간을 참조하는 읽기 전용 클래스.
2.11.2. <ranges>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
ranges
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 기존 컨테이너 또는 범위에 대해 엄밀하고 일반화된 알고리즘을 지원하고\ |
2.11.3. <mdspan>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
mdspan
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
class
std::mdspan
: 모든 유형의 메모리 공간을 다차원 방식으로 접근하는 읽기 전용 클래스.
2.12. 입/출력
2.12.1. <iostream>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
iostream
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 스트림 방식의 문자열 입출력 기능을 제공하는 모듈. |
2.12.2. <iomanip>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
iomanip
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 스트림 입출력 도우미 모듈. |
2.12.3. <strstream>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
strstream
||지원 버전 | C++98 ~ C++23 |
레퍼런스 링크 | |
상태 | 파면됨 제거됨 |
설명 | 문자열 스트림 모듈. |
2.12.4. <sstream>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
sstream
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 문자열 스트림 모듈. |
2.12.5. <fstream>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
fstream
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 파일 스트림 모듈. |
2.12.6. <syncstream>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
syncstream
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 동기식 스트림. |
2.12.7. <print>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
print
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | C언어의 표준 입출력 또는 C++ 스트림으로의 문자열을 출력하는 기능을 제공하는 모듈 |
std::print()
,std::println()
2.13. 유틸리티
2.13.1. <utility>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
utility
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
C++11 이전까지는 오로지
std::pair
만 들어있어서 이름을 <pair>
로 바꿔도 될 수준이었다. 지금은 std::tuple
, 인덱스와 자료형 메타 매개변수를 위한 std::in_place_type_t
, std::in_place_t
, std::integer_sequence
같은 정적인 유틸리티를 제공한다.2.13.2. <functional>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
functional
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
2.13.3. <initializer_list>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
initializer_list
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
2.13.4. <compare>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
compare
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 새로운 객체를 비교하는 방법을 제공하는 모듈. |
class
std::weak_order
,std::strong_order
,std::partial_order
std::compare_three_way()
2.13.5. 컨테이너
2.13.5.1. <tuple>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
tuple
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
class
std::tuple
class
std::tuple_type
,std::tuple_type_t
class
std::tuple_size
,std::tuple_type_v
std::make_tuple()
,std::tie()
,std::forward_as_tuple()
2.13.5.2. <variant>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
variant
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
class
std::variant
class
std::monostate
2.13.5.3. <any>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
any
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
class
std::any
2.13.5.4. <optional>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
optional
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
class
std::optional
class
std::nullopt_t
,std::nullopt
2.13.6. <random>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
random
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 난수 생성\ |
C++11
2.13.7. <chrono>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
chrono
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 시간\ |
- 시간 C++11
- 달력, 시간대 C++20
2.13.8. <locale>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
locale
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 화폐 단위나 숫자 단위 같은 현지화 관련 도구를 제공하는 모듈. |
2.13.9. <filesystem>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
filesystem
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 운영체제의 파일 시스템에 접근하는 인터페이스를 제공하는 모듈 |
2.14. 저수준 메모리 제어
2.14.1. <new>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
new
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | new\ |
2.14.2. <memory>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
memory
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 스마트 포인터를 비롯한 메모리 할당 및 범용적인 메모리 제어와 관련된 연산을 제공하는 모듈. |
2.14.2.1. 스마트 포인터 (Smart Pointer)
많은 메모리 문제를 방지하기 위해 Modern C++에서는 raw 포인터의 사용은 자제하도록 권고된다. C++ 문서에서 귀에 못이 박히도록 설명하고 있지만, 현세대 C++에서 가장 큰 문제점을 안고 있는 부분이므로 대신 표준 라이브러리의 포인터 래퍼 또는 스마트 포인터를 사용하길 바란다. 굳이 써야 한다면 성능이 정말 중요한 부분 또는 인터페이스에는 보이지 않는 cpp 소스 구현 부분에만 포인터를 사용하는 것이 좋다.표준 라이브러리의 스마트 포인터는
std::shared_ptr
, std::unique_ptr
두 종류가 있다.2.14.2.2. 참조 횟수 세기 포인터 (std::shared_ptr)
std::shared_ptr
는 참조 횟수를 세는 방식을 쓰기 때문에 해당 포인터를 잡고 있는 모든 범위에서 벗어나면 스스로 해제된다.- <C++ 예제 보기>
#!syntax cpp #include <memory> long acquire_value_1(std::shared_ptr<long> ptr) { // ptr의 참조 횟수 증가 return *ptr; } long acquire_value_2(const std::shared_ptr<long>& ptr) { // ptr의 참조 횟수 유지 return *ptr; } long acquire_value_3(std::shared_ptr<long>&& ptr) { // ptr은 이 함수가 끝나자 마자 바로 소멸 return *ptr; } int main() { // (1) std::shared_ptr<long> auto ptr1 = std::make_shared<long>(472012831L); // ptr1의 참조 횟수: 1 // (1-1a) std::weak_ptr<long> std::weak_ptr ptr1_weaker = ptr1; // ptr1의 참조 횟수: 1 // (1-1b) std::shared_ptr<long> std::shared_ptr ptr1_derive = ptr1; // ptr1의 참조 횟수: 2 // (1-2) std::shared_ptr<long> auto ptr1_again = ptr1_weaker.lock(); // ptr1의 참조 횟수: 3 long val1 = acquire_value_1(ptr1); // ptr1의 참조 횟수: 4 long val2 = acquire_value_2(ptr1); // ptr1의 참조 횟수: 4 long val3 = acquire_value_2(std::move(ptr1)); // ptr1의 참조 횟수: 4 // 4000 반환 long val4 = acquire_value_3(std::make_shared<long>(4000)); // (2) std::shared_ptr<int[]> std::shared_ptr<int[]> ptr(new int[128]); }
std::shared_ptr
는 몇가지 문제가 있는데, 첫번째로 성능이 느린 편이고, 두번째로는 순환 참조 문제가 발생할 가능성이 있다. 이를 해결하기 위해 소유권이 없는 도우미 클래스 std::weak_ptr
를 제공한다. std::weak_ptr
는 std::shared_ptr
를 가져올 수 있으며 그외에도 소멸 여부와 참조 횟수를 확인할 수 있다. 이를 통하면 std::shared_ptr
를 더 안정적으로 사용할 수 있다. 상기한 예제는 std::shared_ptr
와 std::weak_ptr
의 동작 방식을 보여준다.한편 대다수의 프로그램은 관리하는 객체 하나를 두고 이에 파생된 하위 객체를 통해 동작하는 방식인데 이 경우 공유 포인터를 쓸 일이 많지는 않다. 대부분은 관리 클래스에서 할당한 메모리를 읽기만 하면 충분하므로
std::unique_ptr
를 응용하면 좋다.2.14.2.3. 배타적 소유 포인터 (std::unique_ptr)
std::unique_ptr
는 단일 소유권만 인정하는 스마트 포인터다. std::unique_ptr
를 소유하지 않은 인스턴스에서는 메모리 해제가 불가능하다. 즉 오직 소멸자에서만 메모리가 해제할 수 있다. 또한 std::unique_ptr
자체적으로는 복사가 불가능하고 이동 연산만 가능하다는 특징이 있다.2.14.3. <scoped_allocator>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
scoped_allocator
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 어떤 클래스가 다수의 자료구조를 멤버로 가지고 있을 때 사용할 수 있는 복합적인 메모리 할당자를 구현할 수 있도록 도와주는 모듈. |
2.14.4. <memory_resource>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
memory_resource
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | virtual 등 다형성을 이용해서 메모리 할당자를 구현할 수 있도록 도와주는 모듈 |
2.15. 병렬성
2.15.1. 스레드
2.15.1.1. <thread>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
thread
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 스레드를 동적으로 생성하거나 현재 스레드를 관리하는 기능을 제공하는 모듈 |
2.15.1.2. <jthread>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
jthread
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 기존의 스레드 클래스 std::thread의 단점을 보완하면서 원격 정지 기능도 추가한 모듈. |
2.15.1.3. <stop_token>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
stop_token
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | std::jthread의 실행 제어를 위한 도구들을 제공하는 모듈. 다른 언어에서 찾아볼 수 있는 Cancellation* 류의 클래스다. |
class
std::stop_token
class
std::stop_source
class
std::stop_callback
2.15.2. 상호 배제
2.15.2.1. <mutex>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
mutex
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 상호배제 전략을 이용한 잠금 기능을 제공하는 모듈. |
class
std::mutex
class
std:timed_mutex
: 일정 시간 동안만, 또는 특정 시각까지 잠기거나 잠금을 풀 수 있는 락 클래스.class
std::recursive_mutex
: 중복되어 잠길 수 있는 락 클래스. 실제로 완전히 잠금이 풀리려면 잠겼던 횟수만큼 다시 잠금을 풀어야 한다.
2.15.2.2. <condition_variable>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
condition_variable
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 다수의 스레드 사이에서 잠금을 기반으로 스레드의 실행 순서를 제어하는 기능을 제공하는 모듈. |
class
std::condition_variable
:std::unique_lock<std::mutex>
을 받아 락의 소유권을 배타적으로 점유해놨다가 동시성 실행 점유권을 다른 스레드로 넘길 수 있는 클래스.class
std::condition_variable_any
:std::unique_lock<std::mutex>
말고도 다른 종류의 락을 사용할 수 있는 동시성 제어 클래스.
2.15.2.3. <shared_mutex>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
shared_mutex
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 좀 더 유연한 상호배제 전략을 이용한 잠금 기능을 제공하는 모듈. |
class
std::shared_mutex
: 유일한 쓰기 접근과 다수의 읽기 접근이 가능한 락 클래스. 쓰는 작업에만std::mutex
처럼 상호배제 전략을 사용한다. 읽기의 경우 제한이 없으며 모든 읽기/쓰기가 끝날 때 까지 락 인스턴스의 소멸을 막는 역할을 한다.
2.15.2.4. <barrier>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
barrier
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
class
std::barrier
2.15.2.5. <latch>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
latch
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
class
std::latch
2.15.3. 메모리
2.15.3.1. <atomic>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
atomic
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 자명한 자료형에 대하여 원자적 연산을 제공하는 모듈. 자명하지 않은 자료형은 포인터를 사용해야 한다. |
class
std::atomic
class
std::atomic_ref
C++20
2.15.3.2. <rcu>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
rcu
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
2.15.3.3. <hazard_pointer>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
hazard_pointer
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
2.15.4. 비동기 실행
2.15.4.1. <future>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
future
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
2.15.4.2. <coroutine>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
coroutine
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 |
2.15.4.3. <generator>
||<tablewidth=100%><:><color=#282020,#e5e5e5><width=24%><height=32>이름||<colbgcolor=#FFFFFF,#1F2023>
generator
||지원 버전 | |
레퍼런스 링크 | |
상태 | |
설명 | 코루틴을 이용해서 알고리즘을 비동기적으로 실행하도록 도와주는 모듈 |
3. 여담
표준 라이브러리는 단순히 API 명세만 정해졌기에 구현체에 따라 성능이 천차만별이다. 이는 예외 처리나 플랫폼 이식성, 호환성, 범용성, 완성도 같은 문제 때문이다. 가령 게임 업계에서는 예외 기능을 거의 쓰지 않으며 성능을 극한까지 끌어내야 고품질, 대량의 처리가 가능해지므로 직접 구현해서 쓰는 경우가 적지 않다. 게임 엔진을 사서 쓰지 않고 자체 엔진이 있다면 90%는 재구현한다. 특히 C++ 소스코드를 지원하는 게임 엔진들은std::vector
나 std::list
등의 기본적인 템플릿 자료형부터 따로 지원되는 경우가 많다.Boost에서 넘어온 라이브러리들이 상당히 많다. 애초에 부스트의 개발진들이 표준 위원회에 많이 속해있으며, 사실상 부스트가 표준으로 넘어오기 전에 사용되는 테스트베드라고 봐도 좋을 정도이다.
4. 구현체
성능은 구현체마다 천차만별이었으나 C++11의 move semantics가 등장한 이후에 상향 평준화되는 추세다. API만 동일하면 되므로 자기 자신만의 구현체를 만들어 볼 수도 있고 다른 구현체와 성능을 비교해보면 재미있을 것이다. 구현체의 종류는 대략 아래와 같은 것들이 있다.- SGI STL - Alexander Stepanov의 구현체를 기반으로 하는 구현체로, 이름 그대로 실리콘 그래픽스사에서 개발하였다. 다른 많은 구현체들이 이 버전을 기반으로 하고 있을 정도로 가장 잘 알려진 구현체라고 할 수 있다. 개발이 중단된 지 오래되었다.
- Dinkumware STL - Visual Studio에서 이를 기반으로 개량해서 사용했는데 성능에서 안 좋은 얘기를 많이 들었다.
- STLPort - SGI의 구현체를 기반으로 하고 있는 구현체. 과거에 괜찮은 속도로 Visual Studio에서 STLPort를 가져다가 사용하는 경우도 잦았으나 지금은 업데이트가 되지 않고 있다.
- EASTL - EA SPORTS에서 구현한 STL로, 게임 회사들은 이처럼 퍼포먼스 극대화를 위해 자체적으로 STL을 개발하여 쓰기도 한다.
- TSTL - TypeScript에 포팅된 STL 구현체. 이례적으로 C++가 아닌 다른 언어에 구현된 STL.
이 외에도 다양한 구현이 있다. GCC나 Visual Studio가 과거에는 특정 구현체를 기반으로 만들어졌지만 독립적으로 개발하면서 지금은 전혀 다른 구현체라고 해도 무방하다.
5. 외부 링크
[1] 예를 들면 Standard Template Library의 약자라는 설, Stephanov와 Lee가 근무하던 Software Technology Laboratory의 약자라는 설, STephanov and Lee의 약자라는 설, 등등. Stephanov와 Lee가 직접 작성한 Hewlet-Packard 버전의 최초의 STL이나, 실질적으로 더 널리 쓰이던 Silicon Graphics 버전의 SGI STL은 더 이상 관리가 되지 않고 방치가 된 지 오래이고, SGI STL을 계승하려고 노력하던 STLPort도 개발이 중단되었다.[2] 이 위원회의 결과물이 C++98 표준이다.[3] 가상 클래스는 오버헤드가 있으므로 주의해야 한다.
dynamic_cast
처럼 상속 테이블을 죄다 뒤져보기 때문이다.[4] 여담으로 템플릿이지만 오직 할당자만 템플릿 인자로 받고 있다. 즉 std::basic_stacktrace
는 할당자로 생성된 객체가 std::stacktrace_entry
를 구현하기만 하면 괜찮다는 의미다.