std::inplace_vector
template<
class T,
std::size_t N
> struct inplace_vector;
|
(C++26부터)에 정의됨 | |
std::inplace_vector은 연속적인 내부 저장소를 가진 동적으로 크기 조절이 가능한 배열입니다. T 형식의 요소는 객체 자체 내에 저장되고 적절히 정렬됩니다. 내부 저장소의 용량은 컴파일 타임에 고정되며 N와 같습니다.
요소는 연속적으로 저장되므로, 반복자나 임의 접근 operator[]뿐만 아니라 일반 포인터에 대한 오프셋을 사용하여 요소에 접근할 수 있습니다. inplace_vector의 요소에 대한 포인터는 C-배열의 요소에 대한 포인터를 기대하는 모든 함수에 전달될 수 있습니다.
std::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)
- .–처음이나 중간에 여러 요소 삽입 또는 제거 삽입/제거된 요소 수에 선형이며 벡터 끝까지의 거리를 더함: 𝓞(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로 value_type
|
const_iterator
|
구현 정의 LegacyRandomAccessIterator, ConstexprIterator 및 random_access_iterator로 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와 유사합니다. 그러나 객체는 inplace_vector에 삽입될 때 초기화되며, 이는 인스턴스화 시 모든 요소를 생성해야 하는 C 배열이나 std::array와는 다릅니다.
inplace_vector은(는) 동적 메모리 할당이 바람직하지 않은 환경에서 유용합니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_inplace_vector |
202406L |
(C++26) | std::inplace_vector: 고정 용량 인플레이스 저장소를 가진 동적 크기 조정 벡터
|
202603L |
(C++26) | try_push_back() 및 try_emplace_back()에 대한 더 나은 반환 타입. 제거됨 try_append_range()
| |
__cpp_lib_constexpr_inplace_vector |
202502L |
(C++26) | 사소하지 않은 요소 타입에 대한 Constexpr std::inplace_vector
|
예제
#include <algorithm>
#include <array>
#include <cassert>
#include <inplace_vector>
#include <optional>
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) != std::nullopt);
assert(v1.back() == 3);
assert(v1.size() == 4);
assert(v1.try_push_back(13) == std::nullopt); // no place
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
를 에뮬레이션
|