Namespaces
Variants

std:: inplace_vector

From cppreference.net
헤더 파일에 정의됨 <inplace_vector>
template <

class T,
std:: size_t N

> struct inplace_vector ;
(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)
사용하지 않는 메모리를 해제하여 메모리 사용량을 줄입니다
(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)

비멤버 함수

std::swap 알고리즘을 특수화함
(함수 템플릿)
특정 조건을 만족하는 모든 요소를 삭제함
(함수 템플릿)
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 를 에뮬레이션