C++ named requirements: SequenceContainer
SequenceContainer 는 동일한 타입의 객체들을 선형 배열로 저장하는 Container 입니다.
목차 |
요구사항
주어진 유형과 값:
| 유형 | 정의 |
C
|
시퀀스 컨테이너 클래스 |
T
|
C
의 요소 유형
|
A
|
C
의 할당자 유형:
|
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 복사본을 보유합니다. | |
| 사전 조건 |
|
||
| 사후 조건 | std:: distance ( c. begin ( ) , c. end ( ) ) 은 n 입니다. | ||
| C c ( i, j ) ; | 효과 |
해당 범위
[
i
,
j
)
와 요소 단위로 동일한 시퀀스 컨테이너를 생성합니다.
|
|
| 사전 조건 |
|
||
| 사후 조건 | std:: distance ( c. begin ( ) , c. end ( ) ) 은 std:: distance ( i, j ) 입니다. | ||
| 표현식 | 타입 | 의미론 | |
|
C
(
std::
from_range
, rg
)
(C++23 이후) |
C
|
효과 |
범위
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 내의 복사본을 가리키는 반복자. | ||
| 사전 조건 |
|
||
|
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 를 반환합니다. | ||
| 사전 조건 |
|
||
| v. insert ( p, i, j ) |
Iter
|
효과 |
p
앞에
[
i
,
j
)
범위의 요소들을 복사하여 삽입합니다.
|
| 반환값 | v 에 삽입된 첫 번째 요소의 복사본을 가리키는 반복자, 또는 i == j 가 true 인 경우 p . | ||
| 선제 조건 |
|
||
|
v.
insert_range
(
p, rg
)
(C++23 이후) |
Iter
|
효과 |
p
앞에
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. empty ( ) 이 true 입니다. | ||
| 복잡도 | 선형. | ||
| v. assign ( i, j ) | void | 효과 |
v
의 요소들을
[
i
,
j
)
의 복사본으로 대체합니다.
|
| 선결 조건 |
|
||
|
v.
assign_range
(
rg
)
(C++23부터) |
void | 효과 |
v
의 요소들을
rg
의 각 요소의 복사본으로 대체합니다.
|
| 사전 조건 |
|
||
|
v.
assign
(
il
)
(C++11부터) |
void | v. assign ( il. begin ( ) , il. end ( ) ) 와 동등합니다. | |
| v. assign ( n, t ) | void | 효과 | v 내의 요소들을 n 개의 t 복사본으로 대체합니다. |
| 사전 조건 |
|
||
|
추가 연산
[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 의 복사본을 앞에 추가합니다. | ||
| 사전 조건 |
|
||
|
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]
복사본으로 삽입합니다.
|
||
| 사전 조건 |
T
가
EmplaceConstructible
으로
C
에
*
ranges::
begin
(
rg
)
로부터 생성 가능해야 합니다.
|
||
| v. push_back ( t ) | void | 컨테이너 |
basic_string
,
vector
,
inplace_vector
,
deque
,
list
|
| 효과 | t 의 복사본을 추가합니다. | ||
| 사전 조건 |
|
||
|
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]
복사본들을 삽입합니다.
|
||
| 사전 조건 |
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 일 때. | ||
| 참고 사항 | |||
|
|||
또한, 모든 시퀀스 컨테이너에 대해:
-
두 개의 입력 반복자를 받는 생성자 템플릿과
insert,append,assign,replace의 두 개의 입력 반복자를 받는 멤버 함수 템플릿 오버로드는, 해당 템플릿 인자가 LegacyInputIterator 를 만족하지 않을 경우 오버로드 해결에 참여하지 않습니다.
|
(C++17부터) |
표준 라이브러리
다음 표준 라이브러리 문자열 타입과 컨테이너들은 SequenceContainer 요구사항을 충족합니다:
|
문자 시퀀스를 저장하고 조작함
(클래스 템플릿) |
|
|
(C++11)
|
고정 크기의 인플레이스 연속 배열
(클래스 템플릿) |
|
크기 조정 가능한 연속 배열
(클래스 템플릿) |
|
|
(C++26)
|
크기 조정 가능, 고정 용량, 인플레이스 연속 배열
(클래스 템플릿) |
|
양방향 큐
(클래스 템플릿) |
|
|
(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 [ ] 에 암시적 요구사항이 없었음 | 암시적 요구사항이 추가됨 |