Containers library
컨테이너 라이브러리는 프로그래머들이 큐, 리스트, 스택과 같은 일반적인 자료 구조를 쉽게 구현할 수 있게 해주는 클래스 템플릿과 알고리즘의 일반적인 컬렉션입니다. 두 가지 (C++11 이전) 세 가지 (C++11 이후) 클래스의 컨테이너가 있습니다:
- 시퀀스 컨테이너,
- 연관 컨테이너,
|
(C++11부터) |
각각은 서로 다른 연산 집합을 지원하도록 설계되었습니다.
컨테이너는 요소들을 위해 할당된 저장 공간을 관리하며, 직접적으로 또는 반복자(포인터와 유사한 속성을 가진 객체)를 통해 이들에 접근할 수 있는 멤버 함수들을 제공합니다.
대부분의 컨테이너는 최소한 여러 개의 공통 멤버 함수를 가지며 기능을 공유합니다. 특정 애플리케이션에 가장 적합한 컨테이너는 제공되는 기능뿐만 아니라 다양한 작업 부하에 대한 효율성에 따라 달라집니다.
목차 |
시퀀스 컨테이너
시퀀스 컨테이너는 순차적으로 접근할 수 있는 데이터 구조를 구현합니다.
|
(C++11)
|
고정 크기 인플레이스 연속 배열
(클래스 템플릿) |
|
크기 조정 가능한 연속 배열
(클래스 템플릿) |
|
|
(C++26)
|
크기 조정 가능, 고정 용량, 인플레이스 연속 배열
(클래스 템플릿) |
|
(C++26)
|
삭제된 요소의 메모리를 재사용하는 컬렉션
(클래스 템플릿) |
|
양방향 큐
(클래스 템플릿) |
|
|
(C++11)
|
단일 연결 리스트
(클래스 템플릿) |
|
이중 연결 리스트
(클래스 템플릿) |
연관 컨테이너
연관 컨테이너는 빠르게 검색 가능한 정렬된 데이터 구조를 구현합니다( O(log n) 복잡도).
|
고유 키의 컬렉션, 키로 정렬됨
(class template) |
|
|
키-값 쌍의 컬렉션, 키로 정렬됨, 키는 고유함
(class template) |
|
|
키의 컬렉션, 키로 정렬됨
(class template) |
|
|
키-값 쌍의 컬렉션, 키로 정렬됨
(class template) |
비순서 연관 컨테이너 (since C++11)
정렬되지 않은 연관 컨테이너는 빠르게 검색 가능한( O(1) 평균, O(n) 최악의 경우 복잡도) 정렬되지 않은(해시된) 데이터 구조를 구현합니다.
|
(C++11)
|
키로 해시된 고유 키들의 컬렉션
(클래스 템플릿) |
|
(C++11)
|
키로 해시된 키-값 쌍의 컬렉션, 키는 고유함
(클래스 템플릿) |
|
(C++11)
|
키로 해시된 키들의 컬렉션
(클래스 템플릿) |
|
(C++11)
|
키로 해시된 키-값 쌍의 컬렉션
(클래스 템플릿) |
컨테이너 어댑터
컨테이너 어댑터는 순차 컨테이너에 대해 다른 인터페이스를 제공합니다.
|
컨테이너를 적응시켜 스택(LIFO 데이터 구조)을 제공함
(클래스 템플릿) |
|
|
컨테이너를 적응시켜 큐(FIFO 데이터 구조)를 제공함
(클래스 템플릿) |
|
|
컨테이너를 적응시켜 우선순위 큐를 제공함
(클래스 템플릿) |
|
|
(C++23)
|
컨테이너를 적응시켜 키로 정렬된 고유 키들의 컬렉션을 제공함
(클래스 템플릿) |
|
(C++23)
|
두 개의 컨테이너를 적응시켜 고유 키로 정렬된 키-값 쌍들의 컬렉션을 제공함
(클래스 템플릿) |
|
(C++23)
|
컨테이너를 적응시켜 키로 정렬된 키들의 컬렉션을 제공함
(클래스 템플릿) |
|
(C++23)
|
두 개의 컨테이너를 적응시켜 키로 정렬된 키-값 쌍들의 컬렉션을 제공함
(클래스 템플릿) |
뷰 (C++20부터)
뷰는 요소들의 비소유 배열 위에 1차원 또는 다차원 뷰를 통해 상호작용할 수 있는 유연한 기능을 제공합니다.
|
(C++20)
|
연속된 객체 시퀀스에 대한 비소유 뷰
(클래스 템플릿) |
|
(C++23)
|
다차원 비소유 배열 뷰
(클래스 템플릿) |
반복자 무효화
읽기 전용 메서드는 절대 무효화하지 않습니다. 컨테이너의 내용을 수정하는 메서드는 다음 표에 요약된 대로 반복자 및/또는 참조를 무효화할 수 있습니다.
| 카테고리 | 컨테이너 | 삽입 후에... | 삭제 후에... | 조건부 | ||
|---|---|---|---|---|---|---|
| 반복자 가 유효한가? | 참조 가 유효한가? | 반복자 가 유효한가? | 참조 가 유효한가? | |||
| 시퀀스 컨테이너 | array | 해당 없음 | 해당 없음 | |||
| vector | 아니오 | 해당 없음 | 용량이 변경된 삽입 | |||
| 예 | 예 |
수정된 요소 이전
(삽입의 경우 용량이 변경되지 않았을 때만) |
||||
| 아니오 | 아니오 | 수정된 요소 위치 또는 이후 | ||||
| deque | 아니오 | 예 | 예, 삭제된 요소 제외 | 첫 번째 또는 마지막 요소 수정 | ||
| 아니오 | 아니오 | 중간 요소만 수정 | ||||
| list | 예 | 예, 삭제된 요소 제외 | ||||
| forward_list | 예 | 예, 삭제된 요소 제외 | ||||
| 연관 컨테이너 |
set
multiset map multimap |
예 | 예, 삭제된 요소 제외 | |||
| 비순차 연관 컨테이너 |
unordered_set
unordered_multiset unordered_map unordered_multimap |
아니오 | 예 | 해당 없음 | 재해시가 발생한 삽입 | |
| 예 | 예, 삭제된 요소 제외 | 재해시 없음 | ||||
|
이 섹션은 불완전합니다
이유: C++23 "flat" 어댑터들( std::flat_set 등)에 대한 iterator 무효화 내용 추가 필요 |
|
이 섹션은 불완전합니다
이유: C++26 std::inplace_vector 에 대한 반복자 무효화 추가 필요 |
여기서, insertion 은 컨테이너에 하나 이상의 요소를 추가하는 모든 메서드를 의미하며, erasure 는 컨테이너에서 하나 이상의 요소를 제거하는 모든 메서드를 의미합니다.
- 삽입 메서드의 예시로는 std::set::insert , std::map::emplace , std::vector::push_back , 그리고 std::deque::push_front 이 있습니다.
|
(C++11부터) |
-
삭제 메서드의 예시로는
std::set::erase
,
std::vector::pop_back
,
std::deque::pop_front
, 그리고
std::map::clear
이 있습니다.
-
clear는 모든 반복자와 참조를 무효화합니다. 모든 요소를 삭제하기 때문에, 이는 기술적으로 위의 규칙들을 준수합니다.
-
명시적으로 지정되지 않았거나(명시적으로 또는 다른 함수를 기준으로 함수를 정의함으로써) 컨테이너를 라이브러리 함수에 인수로 전달하는 것은 해당 컨테이너 내 객체에 대한 반복자를 무효화하거나 객체의 값을 변경하지 않습니다.
과거 끝 반복자는 특별히 언급할 가치가 있습니다. 일반적으로 이 반복자는 삭제되지 않은 요소에 대한 일반 반복자처럼 무효화됩니다. 따라서 std::set::end 는 절대 무효화되지 않으며 , std::unordered_set::end 는 재해시 시에만 무효화됩니다 (since C++11) , std::vector::end 는 항상 무효화됩니다 (수정된 요소들 뒤에 항상 위치하기 때문입니다), 그리고 다른 경우들도 마찬가지입니다.
한 가지 예외가 있습니다: std::deque 의 마지막 요소를 삭제하는 제거 연산은 실제로 past-the-end 반복자를 무효화합니다. 비록 이것이 컨테이너의 제거된 요소(또는 요소 자체)가 아니더라도 말입니다. std::deque 반복자에 대한 일반 규칙과 결합하면, 최종 결과는 std::deque::end 를 무효화하지 않는 유일한 수정 연산이 마지막 요소가 아닌 첫 번째 요소를 삭제하는 제거 연산이라는 것입니다.
스레드 안전성
|
(C++11부터) |
함수 테이블
참고: std::basic_string 는 표준에서 컨테이너로 취급되지는 않지만 유사성으로 인해 많은 부분에서 컨테이너처럼 동작합니다. 편의를 위해 여기서는 '의사 컨테이너(Pseudo container)'로 분류됩니다.
| - C++03에 존재하는 함수들 | |
| - C++11부터 존재하는 함수들 | |
| - C++17부터 존재하는 함수들 | |
| - C++20부터 존재하는 함수들 | |
| - C++23부터 존재하는 함수들 |
|
이 섹션은 불완전합니다
이유: C++26 "color"를 추가하고 std::inplace_vector 에 대한 멤버/비멤버 함수 테이블을 채우십시오 |
멤버 함수 테이블
- 참고: 두 개의 서로 다른 extract 라인에 있는 함수들은 서로 다른 의미와 구문을 가집니다:
- ↑ 예를 들어, node_type extract ( const_iterator ) 또는 node_type extract ( Key & )
- ↑ 예를 들어, container_type extract ( ) &&
비멤버 함수 테이블
| 의사 컨테이너 | 시퀀스 컨테이너 | 연관 컨테이너 | 무순서 연관 컨테이너 | 컨테이너 어댑터 | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 헤더 |
<string>
|
<array>
|
<vector>
|
<deque>
|
<forward_list>
|
<list>
|
<set>
|
<map>
|
<unordered_set>
|
<unordered_map>
|
<stack>
|
<queue>
|
<flat_set>
|
<flat_map>
|
헤더 | |||||||||||||||||||||||||||||||
| 컨테이너 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
컨테이너 | ||||||||||||||||||||||||
| 비멤버 함수 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
비멤버 함수 | |||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||
| 컨테이너 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
컨테이너 | ||||||||||||||||||||||||
| 헤더 |
<string>
|
<array>
|
<vector>
|
<deque>
|
<forward_list>
|
<list>
|
<set>
|
<map>
|
<unordered_set>
|
<unordered_map>
|
<stack>
|
<queue>
|
<flat_set>
|
<flat_map>
|
헤더 | |||||||||||||||||||||||||||||||
| 의사 컨테이너 | 시퀀스 컨테이너 | 연관 컨테이너 | 무순서 연관 컨테이너 | 컨테이너 어댑터 | ||||||||||||||||||||||||||||||||||||||||||
|
|
(C++20부터) |
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 51 | C++98 |
컨테이너 반복자가 임의의 라이브러리 연산에 의해
무효화될 수 있음 |
명시된 경우에만
무효화됨 |
참고 항목
C++ 명명된 요구사항:
- Container
- SequenceContainer
- ContiguousContainer
- ReversibleContainer
- AssociativeContainer
- AllocatorAwareContainer
- UnorderedAssociativeContainer
|
수치 배열, 배열 마스크 및 배열 슬라이스
(클래스 템플릿) |
|
|
문자 시퀀스 저장 및 조작
(클래스 템플릿) |
|
|
(C++17)
|
읽기 전용 문자열 뷰
(클래스 템플릿) |