Namespaces
Variants

C++ named requirements: SequenceContainer

From cppreference.net
C++ named requirements

SequenceContainer 는 동일한 타입의 객체들을 선형 배열로 저장하는 Container 입니다.

목차

요구사항

주어진 유형과 값:

유형 정의
C 시퀀스 컨테이너 클래스
T C 의 요소 유형
A C 의 할당자 유형:
  • C::allocator_type 가 존재하는 경우,
  • 그렇지 않으면 std:: allocator < T >
R (C++23부터) container-compatible-range  <T> 를 모델링하는 유형
Args (C++11부터) 템플릿 매개변수 팩
Iter C::iterator
Ref C::reference
CRef C::const_reference
정의
v C 유형의 값
cv const C 유형의 값
i , j LegacyInputIterator s 이며, [ i , j ) 유효한 범위 이고 반복자가 C::value_type 으로 암시적으로 변환 가능한 요소를 참조함
rg (C++23부터) R 유형의 값
il (C++11부터) std:: initializer_list < C :: value_type > 유형의 값
n C::size_type 유형의 값
p v 내의 유효한 const 반복자
q v 내의 역참조 가능한 const 반복자
q1 , q2 v 내의 const 반복자이며, [ q1 , q2 ) 가 유효한 범위임
t (C++11 이전) 좌측값 또는 const 우측값 (C++11부터) 이며 C::value_type 유형
rv (C++11부터) C::value_type 유형의 비-const 우측값
args (C++11부터) Arg&& 패턴을 가진 함수 매개변수 팩

C 는 다음의 모든 조건이 충족될 때 SequenceContainer 요구사항을 만족합니다:

  • C Container 요구사항을 충족합니다.
  • 다음 문장과 표현식은 올바른 형태를 가지며 지정된 의미를 가집니다:
기본 연산
(표준 라이브러리의 모든 시퀀스 컨테이너에 필요함 standard library 제외 std::array (C++11 이후) )
Statement Semantics [1]
C c ( n, t ) ; 효과 시퀀스 컨테이너를 구성하며 n 개의 t 복사본을 보유합니다.
사전 조건

T CopyInsertable C 에 대해 만족해야 함.

(C++11부터)
사후 조건 std:: distance ( c. begin ( ) , c. end ( ) ) n 입니다.
C c ( i, j ) ; 효과 해당 범위 [ i , j ) 와 요소 단위로 동일한 시퀀스 컨테이너를 생성합니다.
  • 범위 [ i , j ) 내의 각 반복자는 정확히 한 번 역참조됩니다.
사전 조건

T EmplaceConstructible 으로 C * i 로부터 생성 가능해야 합니다.

(C++11부터)
사후 조건 std:: distance ( c. begin ( ) , c. end ( ) ) std:: distance ( i, j ) 입니다.
표현식 타입 의미론
C ( std:: from_range , rg )
(C++23 이후)
C 효과 범위 rg 와 요소 단위로 동일한 시퀀스 컨테이너를 생성합니다.
  • 범위 rg 내의 각 반복자는 정확히 한 번 역참조됩니다.
사전 조건 T EmplaceConstructible 으로 X * ranges:: begin ( rg ) 으로부터 생성 가능해야 합니다.
사후 조건 std:: distance ( begin ( ) , end ( ) ) ranges:: distance ( rg ) 입니다.
C ( il )
(C++11 이후)
C C ( il. begin ( ) , il. end ( ) ) 와 동등함.
v = il
(C++11부터)
C& 효과 il 이 나타내는 범위를 v 에 할당합니다. [2]
반환 값 * this
선제 조건 T CopyInsertable 이고 C 에 삽입 가능해야 하며 CopyAssignable 이어야 합니다.
사후 조건 v 의 기존 요소들은 파괴되거나 할당됩니다.
v. emplace ( p, args )
(C++11부터)
Iter 효과 T 타입의 객체를 std:: forward < Args > ( args ) ... 로 생성하여 p 앞에 삽입합니다.
반환값 args 로부터 v 안에 생성된 새 요소를 가리키는 반복자.
사전 조건 T EmplaceConstructible 으로 C args 로부터 생성 가능해야 합니다.
v. insert ( p, t ) Iter 효과 p 앞에 t 의 복사본을 삽입합니다.
반환 값 t 가 삽입된 v 내의 복사본을 가리키는 반복자.
사전 조건

T CopyInsertable C 에 대해 만족해야 함.

(C++11부터)
v. insert ( p, rv )
(C++11부터)
Iter 효과 p 앞에 rv 의 복사본을 삽입하며, 이동 의미론(move semantics)을 사용할 수 있습니다.
반환값 v 에 삽입된 rv 의 복사본을 가리키는 반복자.
사전 조건 T MoveInsertable 이어야 하며 C 에 삽입 가능해야 합니다.
v. insert ( p, n, t ) Iter 효과 p 앞에 t n 개 복사본을 삽입합니다.
반환값 v 에 삽입된 첫 번째 요소의 복사본을 가리키는 반복자, 또는 n 0 인 경우 p 를 반환합니다.
사전 조건

T CopyInsertable 이고 C 에 삽입 가능하며, CopyAssignable 이어야 합니다.

(C++11부터)
v. insert ( p, i, j ) Iter 효과 p 앞에 [ i , j ) 범위의 요소들을 복사하여 삽입합니다.
  • [ i , j ) 범위 내의 각 iterator는 정확히 한 번 역참조됩니다.
반환값 v 에 삽입된 첫 번째 요소의 복사본을 가리키는 반복자, 또는 i == j true 인 경우 p .
선제 조건
(C++11부터)
  • i j v 에 속하지 않아야 합니다.
v. insert_range ( p, rg )
(C++23 이후)
Iter 효과 p 앞에 rg 범위의 요소들을 복사하여 삽입합니다.
  • rg 범위의 각 반복자는 정확히 한 번 역참조됩니다.
반환 값 v 에 삽입된 첫 번째 요소의 복사본을 가리키는 반복자, 또는 rg 가 비어 있는 경우 p 를 반환합니다.
사전 조건
v. insert ( p, il )
(C++11 이후)
Iter 다음 코드와 동등함: v. insert ( p, il. begin ( ) , il. end ( ) ) .
v. erase ( q ) Iter 효과 q 가 가리키는 요소를 삭제합니다.
반환값 지워진 요소 바로 다음에 위치한 요소를 가리키는 반복자. 만약 해당 요소가 존재하지 않으면 q 이전의 요소를 가리키거나 v. end ( ) 를 반환합니다.
v. erase ( q1, q2 ) Iter 효과 [ q1 , q2 ) 범위의 요소들을 삭제합니다.
반환값 요소들이 삭제되기 전에 q2 가 가리키던 요소를 가리키는 반복자, 또는 해당하는 요소가 존재하지 않는 경우 v. end ( ) 를 반환합니다.
v. clear ( ) void 효과 v 내의 모든 요소를 파괴합니다.
  • v 의 요소를 참조하는 모든 레퍼런스, 포인터, 반복자를 무효화하며 past-the-end 반복자도 무효화할 수 있습니다.
사후 조건 v. empty ( ) true 입니다.
복잡도 선형.
v. assign ( i, j ) void 효과 v 의 요소들을 [ i , j ) 의 복사본으로 대체합니다.
  • v 의 요소들을 참조하는 모든 레퍼런스, 포인터 및 반복자를 무효화합니다.
  • [ i , j ) 범위 내의 각 반복자는 정확히 한 번 역참조됩니다.
선결 조건
  • T EmplaceConstructible 이어야 하며 C * i 로부터 생성 가능해야 합니다.
  • T * i 로부터 할당 가능해야 합니다.
(C++11부터)
  • i j v 에 속하지 않아야 합니다.
v. assign_range ( rg )
(C++23부터)
void 효과 v 의 요소들을 rg 의 각 요소의 복사본으로 대체합니다.
  • 만약 std:: assignable_from
    < T & , ranges:: range_reference_t < R >>
    가 모델링되지 않으면 프로그램의 형식이 잘못되었습니다.
  • v 의 요소들을 참조하는 모든 참조, 포인터 및 반복자를 무효화합니다.
  • rg 범위 내의 각 반복자는 정확히 한 번 역참조됩니다.
사전 조건
v. assign ( il )
(C++11부터)
void v. assign ( il. begin ( ) , il. end ( ) ) 와 동등합니다.
v. assign ( n, t ) void 효과 v 내의 요소들을 n 개의 t 복사본으로 대체합니다.
사전 조건

T CopyInsertable 이고 C 에 삽입 가능하며, CopyAssignable 이어야 합니다.

(C++11부터)
추가 연산 [3]
(특정 시퀀스 컨테이너에만 필요, std:: 생략)
Expression Type Semantics
v. front ( ) Ref 컨테이너 basic_string , array , vector , inplace_vector , deque , list , forward_list
반환 값 * v. begin ( )
cv. front ( ) CRef 컨테이너 basic_string , array , vector , inplace_vector , deque , list , forward_list
반환 값 * cv. begin ( )
v. back ( ) Ref 컨테이너 basic_string , array , vector , inplace_vector , deque , list
다음 코드와 동일함 auto tmp = v. end ( ) ; -- tmp ; return * tmp ; [4] .
cv. back ( ) CRef 컨테이너 basic_string , array , vector , inplace_vector , deque , list
다음 코드와 동일함 auto tmp = cv. end ( ) ; -- tmp ; return * tmp ; [5] .
v. emplace_front ( args )
(C++11 이후)
void 컨테이너 deque , list , forward_list
효과 T 타입의 객체를 std:: forward < Args > ( args ) ... 로 생성하여 앞쪽에 추가합니다.
반환값 v. front ( )
사전 조건 T EmplaceConstructible 으로 C args 로부터 생성 가능해야 합니다.
v. emplace_back ( args )
(C++11 이후)
void 컨테이너 vector , inplace_vector , deque , list
효과 T 타입의 객체를 std:: forward < Args > ( args ) ... 로 생성하여 추가합니다.
반환값 v. back ( )
사전 조건 T EmplaceConstructible 에서 C args 에 의해 생성 가능해야 합니다.
v. push_front ( t ) void 컨테이너 deque , list , forward_list
효과 t 의 복사본을 앞에 추가합니다.
사전 조건

T CopyInsertable C 에 삽입 가능해야 함.

(C++11부터)
v. push_front ( rv )
(C++11 이후)
void 컨테이너 deque , list , forward_list
효과 rv 의 복사본을 앞에 추가하며, 이동 의미론(move semantics)을 사용할 수 있습니다.
사전 조건 T MoveInsertable 이어야 하며 C 에 삽입 가능해야 합니다.
v. prepend_range ( rg )
(C++23부터)
void 컨테이너 deque , list , forward_list
효과 v. begin ( ) 앞에 rg 범위의 요소들을 [6] 복사본으로 삽입합니다.
  • rg 범위의 각 반복자는 정확히 한 번 역참조됩니다.
사전 조건 T EmplaceConstructible 으로 C * ranges:: begin ( rg ) 로부터 생성 가능해야 합니다.
v. push_back ( t ) void 컨테이너 basic_string , vector , inplace_vector , deque , list
효과 t 의 복사본을 추가합니다.
사전 조건

T CopyInsertable C 에 삽입 가능해야 함.

(C++11부터)
v. push_back ( rv )
(C++11 이후)
void 컨테이너 basic_string , vector , inplace_vector , deque , list
효과 rv 의 복사본을 추가합니다(이동 의미론을 사용할 수 있음).
사전 조건 T MoveInsertable 이어야 하며 C 에 삽입 가능해야 합니다.
v. append_range ( rg )
(C++23부터)
void 컨테이너 vector , inplace_vector , deque , list
효과 v. end ( ) 앞에 rg 내 요소들의 [6] 복사본들을 삽입합니다.
  • 범위 rg 내의 각 반복자는 정확히 한 번 역참조됩니다.
사전 조건 T EmplaceConstructible 으로 C * ranges:: begin ( rg ) 로부터 생성 가능해야 합니다.
v. pop_front ( ) void 컨테이너 deque , list , forward_list
효과 첫 번째 요소를 제거합니다.
사전 조건 a. empty ( ) false 입니다.
v. pop_back ( ) void 컨테이너 basic_string , vector , inplace_vector , deque , list
효과 마지막 요소를 제거합니다.
사전 조건 a. empty ( ) false 입니다.
v [ n ] Ref 컨테이너 basic_string , array , vector , inplace_vector , deque
다음 코드와 동일함: return * ( v. begin ( ) + n ) ; .
cv [ n ] CRef 컨테이너 basic_string , array , vector , inplace_vector , deque
다음에 해당함: return * ( cv. begin ( ) + n ) ; .
v. at ( n ) Ref 컨테이너 basic_string , array , vector , inplace_vector , deque
반환값 * ( v. begin ( ) + n )
예외 다음 경우 std::out_of_range 를 발생시킵니다: n >= v. size ( ) true 일 때.
cv. at ( n ) CRef 컨테이너 basic_string , array , vector , inplace_vector , deque
반환 값 * ( cv. begin ( ) + n )
예외 다음 경우 std::out_of_range 를 발생시킴: n >= cv. size ( ) true 일 때.
참고 사항
  1. 어떤 다른 연산들과 효과가 동등한 표현식의 경우, 해당 연산들 내부 표현식들의 조건들이 표에 나열된 조건들 위에 상속됩니다.
  2. std::array 중괄호로 둘러싸인 초기화 리스트 로부터의 대입을 지원하지만, std::initializer_list 로부터의 대입은 지원하지 않습니다.
  3. 아래의 모든 연산들은 prepend_range append_range 를 제외하고 (C++23부터) 분할 상환 상수 시간이 소요됩니다.
  4. C++98에서, tmp C::iterator 타입으로 선언되었습니다.
  5. C++98에서, tmp C::const_iterator 타입으로 선언되었습니다.
  6. 6.0 6.1 rg 내 요소들의 순서에 대한 삽입 순서는 비반전적입니다.

또한, 모든 시퀀스 컨테이너에 대해:

  • 두 개의 입력 반복자를 받는 생성자 템플릿과 insert , append , assign , replace 의 두 개의 입력 반복자를 받는 멤버 함수 템플릿 오버로드는, 해당 템플릿 인자가 LegacyInputIterator 를 만족하지 않을 경우 오버로드 해결에 참여하지 않습니다.
  • LegacyInputIterator 또는 Allocator 템플릿 매개변수를 가진 추론 가이드는 해당 매개변수에 대해 입력 반복자나 할당자 자격을 갖추지 않은 타입이 추론되는 경우 오버로드 해결에 참여하지 않습니다.
(C++17부터)

표준 라이브러리

다음 표준 라이브러리 문자열 타입과 컨테이너들은 SequenceContainer 요구사항을 충족합니다:

문자 시퀀스를 저장하고 조작함
(클래스 템플릿)
(C++11)
고정 크기의 인플레이스 연속 배열
(클래스 템플릿)
크기 조정 가능한 연속 배열
(클래스 템플릿)
크기 조정 가능, 고정 용량, 인플레이스 연속 배열
(클래스 템플릿)
양방향 큐
(클래스 템플릿)
단일 연결 리스트
(클래스 템플릿)
이중 연결 리스트
(클래스 템플릿)

사용법 참고 사항

컨테이너 장점 단점
std::vector 빠른 접근, 연속 메모리 저장 대부분의 삽입/삭제 작업이 비효율적
std:: inplace_vector 빠른 접근, 인플레이스 연속 메모리 저장 고정된 용량과 대부분의 삽입/삭제 작업이 비효율적
std::array 빠른 접근, 인플레이스 연속 메모리 저장 고정된 요소 개수와 삽입/삭제 기능 없음
std::deque 빠른 접근, 시작/끝에서 효율적인 삽입/삭제 시퀀스 중간에서의 삽입/삭제가 비효율적
std::list
std::forward_list
시퀀스 중간에서 효율적인 삽입/삭제 접근이 대부분 선형 시간 소요

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 수정된 동작
LWG 139 C++98 선택적 연산들이 지정된 컨테이너에 대해
구현될 필요가 없었음
분할 상환 시간으로 요구됨
LWG 149 C++98 v. insert ( p, t ) Iter 를 반환하는 반면
v. insert ( p, n, t ) v. insert ( p, n, t )
void 를 반환함
모두 Iter 를 반환함
LWG 151 C++98 q1 가 역참조 가능해야 했음 [1] 역참조 불가능할 수 있음
LWG 355 C++98 v. back ( ) 또는 v. pop_back ( ) 호출 시
-- v. end ( ) 가 실행되어 위험함 [2]
v. end ( ) 의 복사본을
감소시킴
LWG 589 C++98 i j 가 참조하는 요소들이
C::value_type 로 변환 가능하지 않을 수 있음
C::value_type 로 암시적으로
변환 가능함
LWG 2194 C++11 std::queue , std::priority_queue
std::stack SequenceContainer 였음 [3]
이들은 SequenceContainer 가 아님
LWG 2231 C++11 v. clear ( ) 의 복잡도 요구사항이
C++11에서 실수로 누락됨
선형 복잡도로 재확인됨
LWG 3927 C++98 operator [ ] 에 암시적 요구사항이 없었음 암시적 요구사항이 추가됨
  1. 이것은 v. erase ( v. begin ( ) , v. end ( ) ) 의 동작이 v 가 빈 컨테이너일 때 정의되지 않도록 만들기 때문에 결함입니다.
  2. 만약 v. end ( ) 의 타입이 기본 타입(fundamental type)이라면, -- v. end ( ) 는 올바르지 않은 형식입니다. v 의 타입이 템플릿화된 경우에는 이 버그를 발견하기 어려울 수 있어 위험합니다.
  3. C++98에서 이들은 SequenceContainer 로 문서화되지 않았습니다.