C++ named requirements: Container
Container 는 다른 객체들을 저장하고 포함된 객체들이 사용하는 메모리 관리를 담당하는 객체입니다.
목차 |
요구사항
주어진 유형과 값:
| 유형 | 정의 |
T
|
객체 유형 |
C
|
T
유형의 객체를 포함하는 컨테이너 클래스
|
| 값 | 정의 |
| u , v |
C
또는
const
C
유형의 값
|
| mv |
C
유형의 값
|
| cv | const C 유형의 값 |
| lhs , rhs |
C
유형의 lvalue
|
| i , j |
C::iterator
또는
const
C
::
iterator
유형의 값
|
C
는 다음 타입, 구문 및 표현식이 올바른 형태를 가지며 지정된 의미를 가질 경우
Container
요구사항을 충족합니다:
타입
| 유형 | 정의 | 요구 사항 |
|---|---|---|
| typename C :: value_type |
T
|
T
는
CopyConstructible
(C++11 이전)
Erasable
from
C
(C++11 이후)
.
|
| typename C :: reference |
T&
|
명시적 요구 사항 없음 |
| typename C :: const_reference | const T & | |
| typename C :: iterator | 반복자 유형 |
|
| typename C :: const_iterator | 상수 반복자 유형 |
C::const_iterator
는
LegacyForwardIterator
이며, 그
값 유형
은
T
입니다.
|
| typename C :: difference_type | 부호 있는 정수 유형 |
C::difference_type
는
C::iterator
와
C::const_iterator
의
차이 유형
과 동일합니다.
|
| typename C :: size_type | 부호 없는 정수 유형 |
C::size_type
은
C::difference_type
의 모든 음수가 아닌 값을 표현할 수 있을 만큼 충분히 큽니다.
|
문장
| 문장 | 의미론 | 복잡도 | |||
|---|---|---|---|---|---|
|
C c
;
C c = C ( ) ; |
사후 조건 | c. empty ( ) 가 true 임. | 상수 | ||
|
C c
(
v
)
;
C c = C ( v ) ; |
사전 조건 |
|
선형 [1] | ||
| 사후 조건 |
|
||||
| 참고 | |||||
|
|||||
표현식
| 표현식 | 타입 | 의미론 | 복잡도 | |||||
|---|---|---|---|---|---|---|---|---|
| C ( ) |
C
|
사후 조건 | C ( ) . empty ( ) 는 true 입니다. | 상수 | ||||
| C ( v ) |
C
|
선행 조건 |
|
상수 시간 [1] | ||||
| 사후 조건 |
|
|||||||
| lhs = v |
C&
|
사후 조건 |
|
선형 | ||||
| v.~C ( ) | void | 효과 | v 의 모든 요소를 파괴하고 확보된 모든 메모리를 해제합니다. | 선형 | ||||
| mv. begin ( ) |
C::iterator
|
효과 | mv 의 첫 번째 요소를 가리키는 반복자를 반환합니다. | 상수 | ||||
| cv. begin ( ) |
C::const_iterator
|
효과 | cv 의 첫 번째 요소를 가리키는 반복자를 반환합니다. | 상수 | ||||
| mv. end ( ) |
C::iterator
|
효과 | mv 의 past-the-end 반복자를 반환합니다. | 상수 | ||||
| cv. end ( ) |
C::const_iterator
|
효과 | cv 의 끝을 지나는 반복자를 반환합니다. | 상수 | ||||
|
v.
cbegin
(
)
(C++11부터) |
C::const_iterator
|
효과 | const_cast < const C & > ( v ) . begin ( ) 을 반환합니다. | 상수 | ||||
|
v.
cend
(
)
(C++11 이후) |
C::const_iterator
|
효과 | const_cast < const C & > ( v ) . end ( ) 을 반환합니다. | 상수 | ||||
|
i
<=>
j
(C++20부터) |
std::strong_ordering | 제약 조건 |
이 표현식은
C::iterator
가 임의 접근 반복자 요구 사항을 충족할 경우에만 올바르게 형성되어야 합니다.
|
상수 | ||||
| u == v | bool | 효과 |
다음을 반환
|
선형 시간 [2] | ||||
| u ! = v | 효과 | 다음 표현과 동등함 ! ( u == v ) . | ||||||
|
lhs.
swap
(
rhs
)
swap ( lhs, rhs ) |
void | 효과 | lhs 와 rhs 의 내용을 교환합니다. | 상수 시간 [3] | ||||
| v. size ( ) |
C::size_type
|
효과 | v 의 원소 개수를 반환합니다 [4] . | 상수 시간 | ||||
| v. max_size ( ) |
C::size_type
|
효과 |
C
타입의 가능한 가장 큰 컨테이너의 요소 수를 반환합니다.
|
상수 | ||||
| v. empty ( ) | bool | 효과 | v. begin ( ) == v. end ( ) 을 반환합니다. | 상수 시간 | ||||
|
선택적 컨테이너 요구사항
(일부 컨테이너 유형에만 제공됨) |
||||||||
|
u
<=>
v
(C++20부터) |
synth-three-way-result
<
C
::
value_type
>
|
사전 조건 |
T
가
three_way_comparable
를 모델링하거나,
operator
<
가
T
와
const
T
타입의 값들에 대해 정의된 완전 순서 관계여야 함.
|
선형 | ||||
| 효과 |
다음을 반환합니다:
std::
lexicographical_compare_three_way
(
u.
begin
(
)
, u.
end
(
)
,
v.
begin
(
)
, v.
end
(
)
,
synth-three-way
)
[5]
.
|
|||||||
| 참고 사항 | ||||||||
|
||||||||
표현식
i
==
j
,
i
!
=
j
,
i
<
j
,
i
<=
j
,
i
>=
j
,
i
>
j
그리고
i
-
j
에서
i
와/또는
j
가 동일한 요소를 각각 가리키는
C::const_iterator
타입의 반복자로 대체되더라도 의미는 동일하게 유지됩니다.
컨테이너 데이터 경쟁
다음을 참조하십시오: container thread safety .
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 179 | C++98 |
iterator
와
const_iterator
타입이 비교 불가능할 수 있음
|
비교 가능해야 함 |
| LWG 276 | C++98 |
T
가
CopyAssignable
이어야 함
|
T
는
CopyConstructible 이어야 함 |
| LWG 322 | C++98 |
iterator
와
const_iterator
의 값 타입이 지정되지 않음
|
T
로 지정됨
|
| LWG 774 | C++98 | swap ( a, b ) 에 대한 요구사항이 없었음 | 추가됨 |
| LWG 883 | C++98 |
a.
swap
(
b
)
가
swap
(
a, b
)
로 정의되어
순환 정의가 발생함 |
a
와
b
의 값을
교환하는 것으로 정의됨 |
| LWG 1319 | C++98 |
iterator
와
const_iterator
가 다중 패스 보장을 가지지 않을 수 있음 |
이들이
LegacyForwardIterator 요구사항을 충족해야 함 |
|
LWG 2114
( P2167R3 ) |
C++98 | 일부 함수의 bool 이 아닌 반환 타입이 허용됨 | 허용되지 않음 |
| LWG 2182 | C++98 |
reference
와
const_reference
로 표시된 타입들이 불명확하게 지정됨
|
문구 개선됨 |
| LWG 2257 | C++98 |
두 컨테이너가 크기가 다르더라도
동등 비교에 선형 시간이 필요했음 |
이 경우 상수 시간만
필요하도록 변경됨 |
| LWG 2263 | C++11 | LWG 이슈 179 의 해결책이 C++11에서 실수로 누락됨 | 복원됨 |
| LWG 2839 | C++11 | 표준 컨테이너의 자기 이동 대입이 허용되지 않았음 |
허용되지만
결과는 명시되지 않음 |
| N3346 | C++11 |
C::value_type
이
Destructible
이어야 함
|
C
에서
Erasable
이어야 함
|
참고 항목
|
C++ 문서
for
Containers library
|