std:: inplace_vector
|
헤더 파일에 정의됨
<inplace_vector>
|
||
|
template
<
class
T,
|
(C++26부터) | |
inplace_vector
는 연속된 인플레이스(inplace) 저장 공간을 가진 동적으로 크기 조정이 가능한 배열입니다.
T
타입의 요소들은 객체 자체 내에 저장되고 적절히 정렬됩니다. 내부 저장소의 용량은 컴파일 타임에 고정되며
N
과 동일합니다.
요소들은 연속적으로 저장되어 있으며, 이는 요소들이 반복자나 임의 접근
operator
[
]
를 통해서뿐만 아니라, 요소에 대한 일반 포인터 오프셋을 사용해서도 접근할 수 있음을 의미합니다.
inplace_vector
의 요소에 대한 포인터는 C-배열의 요소에 대한 포인터를 기대하는 어떤 함수에도 전달될 수 있습니다.
inplace_vector
는
Container
,
ReversibleContainer
,
ContiguousContainer
, 그리고
SequenceContainer
를 모델링하며,
선택적 시퀀스 컨테이너 요구 사항
의 대부분을 포함합니다. 단,
push_front
,
emplace_front
,
pop_front
, 그리고
prepend_range
멤버 함수는 제공되지 않습니다.
임의의 양의
N
에 대해,
std::inplace_vector<T, N>::iterator
와
std::inplace_vector<T, N>::const_iterator
는
ConstexprIterator
요구 사항을 충족합니다.
특수화 std :: inplace_vector < T, 0 > 는 TriviallyCopyable 이며 비어 있습니다. std:: is_trivially_default_constructible_v < std :: inplace_vector < T, 0 >> 또한 true 입니다.
std :: inplace_vector < T, N > 의 멤버 함수 중 용량 N 을 초과하는 삽입을 유발하는 경우 std::bad_alloc 을 발생시킵니다.
일반적인 연산의
inplace_vector
에 대한 복잡도는 다음과 같습니다:
-
operator[]또는at()를 통한 요소에 대한 임의 접근 – 상수 시간: 𝓞(1) . - 끝에서 요소의 삽입 또는 제거 – 상수 시간: 𝓞(1) .
- 끝에서 요소들의 삽입 또는 제거 – 삽입/제거된 요소 수에 선형: 𝓞(n) .
- 시작 또는 중간에서 요소들의 삽입 또는 제거 – 삽입/제거된 요소 수와 벡터 끝까지의 거리의 합에 선형: 𝓞(n) .
목차 |
반복자 무효화
std::inplace_vector
의 반복자 무효화 보장은
std::vector
와 다릅니다:
-
inplace_vector를 이동시키면 모든 반복자가 무효화됩니다; -
두 개의
inplace_vector를 교환하면 모든 반복자가 무효화됩니다 (교환 과정에서 반복자는 동일한 배열 요소를 계속 가리키게 되어 값이 변경될 수 있습니다).
다음 멤버 함수들은 반복자(iterator)를 무효화할 수 있습니다:
operator=
,
assign
,
assign_range
,
clear
,
emplace
,
erase
,
insert
,
insert_range
,
pop_back
,
resize
, 그리고
swap
.
다음 멤버 함수들은
end
반복자만 무효화할 수 있습니다:
append_range
,
emplace_back
,
push_back
,
try_append_range
,
try_emplace_back
,
try_push_back
,
unchecked_emplace_back
, 그리고
unchecked_push_back
.
템플릿 매개변수
| T | - | 요소 타입. MoveConstructible 및 MoveAssignable 요구사항을 충족해야 합니다. |
| N | - |
용량, 즉
inplace_vector
의 최대 요소 개수 (
0
일 수 있음).
|
멤버 타입
| 유형 | 정의 |
value_type
|
T
|
size_type
|
std::size_t |
difference_type
|
std::ptrdiff_t |
reference
|
value_type & |
const_reference
|
const value_type & |
pointer
|
value_type * |
const_pointer
|
const value_type * |
iterator
|
구현 정의
LegacyRandomAccessIterator
및
random_access_iterator
to
value_type
|
const_iterator
|
구현 정의
LegacyRandomAccessIterator
,
ConstexprIterator
(C++26부터)
및
random_access_iterator
to
const
value_type
|
reverse_iterator
|
std:: reverse_iterator < iterator > |
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > |
멤버 함수
inplace_vector
를 생성합니다
(public member function) |
|
inplace_vector
를 소멸시킵니다
(public member function) |
|
|
컨테이너에 값을 할당합니다
(public member function) |
|
|
컨테이너에 값을 할당합니다
(public member function) |
|
|
컨테이너에 값들의 범위를 할당합니다
(public member function) |
|
요소 접근 |
|
|
범위 검사와 함께 지정된 요소에 접근
(public member function) |
|
|
지정된 요소에 접근
(public member function) |
|
|
첫 번째 요소에 접근
(public member function) |
|
|
마지막 요소에 접근
(public member function) |
|
|
기본 연속 저장소에 대한 직접 접근
(public member function) |
|
반복자 |
|
|
시작 부분에 대한 반복자를 반환합니다
(public member function) |
|
|
끝을 가리키는 반복자를 반환합니다
(public member function) |
|
|
역방향 반복자를 시작 부분에 반환합니다
(public member function) |
|
|
역방향 반복자를 끝 위치로 반환합니다
(public member function) |
|
크기와 용량 |
|
|
컨테이너가 비어 있는지 확인합니다
(public member function) |
|
|
요소의 개수를 반환합니다
(public member function) |
|
|
[static]
|
가능한 최대 요소 수를 반환합니다
(public static member function) |
|
[static]
|
현재 할당된 저장 공간에 보관할 수 있는 요소의 수를 반환합니다
(public static member function) |
|
저장된 요소의 개수를 변경합니다
(public member function) |
|
|
[static]
|
저장 공간 예약
(public static member function) |
|
[static]
|
사용하지 않는 메모리를 해제하여 메모리 사용량을 줄입니다
(public static member function) |
수정자 |
|
|
요소 삽입
(public member function) |
|
|
요소 범위를 삽입합니다
(public member function) |
|
|
제자리에서 요소 생성
(public member function) |
|
|
끝에 제자리에서 요소를 생성합니다
(public member function) |
|
|
제자리에서 끝에 요소를 생성하려 시도합니다
(public member function) |
|
|
무조건적으로 끝에 제자리에서 요소를 생성합니다
(public member function) |
|
|
끝에 요소를 추가합니다
(public member function) |
|
|
끝에 요소를 추가하려고 시도합니다
(public member function) |
|
|
조건 없이 끝에 요소를 추가합니다
(public member function) |
|
|
마지막 요소를 제거합니다
(public member function) |
|
|
요소 범위를 끝에 추가합니다
(public member function) |
|
|
끝에 요소 범위를 추가하려고 시도합니다
(public member function) |
|
|
내용을 지웁니다
(public member function) |
|
|
요소들을 삭제합니다
(public member function) |
|
|
내용을 교환합니다
(public member function) |
|
비멤버 함수
|
(C++26)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |
|
특정 조건을 만족하는 모든 요소를 삭제함
(함수 템플릿) |
|
|
(C++26)
|
두
inplace_vector
의 값을 사전식으로 비교함
(함수 템플릿) |
참고 사항
inplace_vector
의 요소 개수는 객체 자체 내에 요소가 저장되기 때문에 고정된 용량까지 동적으로 변할 수 있으며, 이는
std::array
와 유사합니다. 그러나 C 배열이나
std::array
가 인스턴스화 시 모든 요소를 생성해야 하는 것과 달리, 객체들은
inplace_vector
에 삽입될 때 초기화됩니다.
inplace_vector
는 동적 메모리 할당이 바람직하지 않은 환경에서 유용합니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_inplace_vector
|
202406L
|
(C++26) |
std::inplace_vector
: 고정 용량의 인플레이스 저장소를 가진 동적으로 크기 조정 가능한 벡터
|
__cpp_lib_constexpr_inplace_vector
|
202502L
|
(C++26) |
constexpr
std::inplace_vector
비트리비얼 요소 타입용
|
예제
#include <algorithm> #include <array> #include <cassert> #include <inplace_vector> int main() { std::inplace_vector<int, 4> v1{0, 1, 2}; assert(v1.max_size() == 4); assert(v1.capacity() == 4); assert(v1.size() == 3); assert(std::ranges::equal(v1, std::array{0, 1, 2})); assert(v1[0] == 0); assert(v1.at(0) == 0); assert(v1.front() == 0); assert(*v1.begin() == 0); assert(v1.back() == 2); v1.push_back(3); assert(v1.back() == 3); assert(std::ranges::equal(v1, std::array{0, 1, 2, 3})); v1.resize(3); assert(std::ranges::equal(v1, std::array{0, 1, 2})); assert(v1.try_push_back(3) != nullptr); assert(v1.back() == 3); assert(v1.size() == 4); assert(v1.try_push_back(13) == nullptr); // 공간 없음 assert(v1.back() == 3); assert(v1.size() == 4); v1.clear(); assert(v1.size() == 0); assert(v1.empty()); }
참고 항목
|
크기 조정 가능한 연속 배열
(클래스 템플릿) |
|
|
(C++11)
|
고정 크기 인플레이스 연속 배열
(클래스 템플릿) |
|
양방향 큐
(클래스 템플릿) |
외부 링크
| 1. |
inplace_vector
—
P0843R14
(
std::inplace_vector
)의 참조 구현체
|
| 2. |
static_vector
— Boost.Container가 자체적인 보장 조건을 가진 독립적인 타입으로 인플레이스 벡터를 구현
|
| 3. |
fixed_vector
— EASTL이 추가 템플릿 매개변수를 통해 인플레이스 벡터를 구현
|
| 4. |
small_vector
— Folly도 추가 템플릿 매개변수를 통해 인플레이스 벡터를 구현
|
| 5. |
stack_alloc
— Howard Hinnant의 커스텀 할당자로,
std::vector
위에서
std::inplace_vector
를 에뮬레이션
|