(C++17) | ||||
| Sequence | ||||
(C++11) | ||||
inplace_vector (C++26) | ||||
(C++26) | ||||
(C++11) | ||||
| Associative | ||||
| Unordered associative | ||||
(C++11) | ||||
(C++11) | ||||
(C++11) | ||||
(C++11) | ||||
| Adaptors | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
| Views | ||||
(C++20) | ||||
(C++23) | ||||
| Tables | ||||
| Iterator invalidation | ||||
| Member function table | ||||
| Non-member function table |
Defined in header <inplace_vector> | ||
template< class T, | (since C++26) | |
inplace_vector is a dynamically-resizable array with contiguous inplace storage. The elements of typeT are stored and properly aligned within the object itself. The capacity of the internal storage is fixed at compile-time and is equal toN.
The elements are stored contiguously, which means that elements can be accessed not only through iterators or random-accessoperator[], but also using offsets to regular pointers to elements. A pointer to an element of aninplace_vector may be passed to any function that expects a pointer to an element of a C-array.
Theinplace_vector modelsContainer,ReversibleContainer,ContiguousContainer, andSequenceContainer, including most of theoptional sequence container requirements, except that thepush_front,emplace_front,pop_front, andprepend_range member functions are not provided.
For any positiveN,std::inplace_vector<T, N>::iterator andstd::inplace_vector<T, N>::const_iterator meet theConstexprIterator requirements.
The specializationstd::inplace_vector<T,0> isTriviallyCopyable and is empty.std::is_trivially_default_constructible_v<std::inplace_vector<T,0>> is alsotrue.
Any member function ofstd::inplace_vector<T, N> that would cause insertion beyond the capacityN throwsstd::bad_alloc.
The complexity of common operations oninplace_vectors is as follows:
operator[] orat() – constant:𝓞(1).Contents |
std::inplace_vector iterator invalidation guarantees differ fromstd::vector:
inplace_vector invalidates all iterators;inplace_vectors invalidates all iterators (during swap, the iterator will continue to point to the same array element, and may thus change its value).The following member functions potentially invalidate iterators:operator=,assign,assign_range,clear,emplace,erase,insert,insert_range,pop_back,resize, andswap.
The following member functions potentially invalidateend iterator only:append_range,emplace_back,push_back,try_append_range,try_emplace_back,try_push_back,unchecked_emplace_back, andunchecked_push_back.
| T | - | element type. Must beMoveConstructible andMoveAssignable. |
| N | - | capacity, i.e. the maximum number of elements in theinplace_vector (might be0). |
| Type | Definition |
value_type | T[edit] |
size_type | std::size_t[edit] |
difference_type | std::ptrdiff_t[edit] |
reference | value_type&[edit] |
const_reference | const value_type&[edit] |
pointer | value_type*[edit] |
const_pointer | const value_type*[edit] |
iterator | implementation-definedLegacyRandomAccessIterator andrandom_access_iterator tovalue_type[edit] |
const_iterator | implementation-definedLegacyRandomAccessIterator,ConstexprIterator(since C++26) andrandom_access_iterator toconst value_type[edit] |
reverse_iterator | std::reverse_iterator<iterator>[edit] |
const_reverse_iterator | std::reverse_iterator<const_iterator>[edit] |
constructs theinplace_vector(public member function)[edit] | |
destructs theinplace_vector(public member function)[edit] | |
| assigns values to the container (public member function)[edit] | |
| assigns values to the container (public member function)[edit] | |
| assigns a range of values to the container (public member function)[edit] | |
Element access | |
| access specified element with bounds checking (public member function)[edit] | |
| access specified element (public member function)[edit] | |
| access the first element (public member function)[edit] | |
| access the last element (public member function)[edit] | |
| direct access to the underlying contiguous storage (public member function)[edit] | |
Iterators | |
| returns an iterator to the beginning (public member function)[edit] | |
| returns an iterator to the end (public member function)[edit] | |
| returns a reverse iterator to the beginning (public member function)[edit] | |
| returns a reverse iterator to the end (public member function)[edit] | |
Size and capacity | |
| checks whether the container is empty (public member function)[edit] | |
| returns the number of elements (public member function)[edit] | |
[static] | returns the maximum possible number of elements (public static member function)[edit] |
[static] | returns the number of elements that can be held in currently allocated storage (public static member function)[edit] |
| changes the number of elements stored (public member function)[edit] | |
[static] | reserves storage (public static member function)[edit] |
[static] | reduces memory usage by freeing unused memory (public static member function)[edit] |
Modifiers | |
| inserts elements (public member function)[edit] | |
| inserts a range of elements (public member function)[edit] | |
| constructs element in-place (public member function)[edit] | |
| constructs an element in-place at the end (public member function)[edit] | |
| tries to construct an element in-place at the end (public member function)[edit] | |
| unconditionally constructs an element in-place at the end (public member function)[edit] | |
| adds an element to the end (public member function)[edit] | |
| tries to add an element to the end (public member function)[edit] | |
| unconditionally adds an element to the end (public member function)[edit] | |
| removes the last element (public member function)[edit] | |
| adds a range of elements to the end (public member function)[edit] | |
| tries to add a range of elements to the end (public member function)[edit] | |
| clears the contents (public member function)[edit] | |
| erases elements (public member function)[edit] | |
| swaps the contents (public member function)[edit] | |
| specializes thestd::swap algorithm (function template)[edit] | |
| erases all elements satisfying specific criteria (function template)[edit] | |
(C++26) | lexicographically compares the values of twoinplace_vectors(function template)[edit] |
The number of elements in ainplace_vector may vary dynamically up to a fixed capacity because elements are stored within the object itself similarly tostd::array. However, objects are initialized as they are inserted intoinplace_vector unlike C arrays orstd::array , which must construct all elements on instantiation.
inplace_vector is useful in environments where dynamic memory allocations are undesired.
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_inplace_vector | 202406L | (C++26) | std::inplace_vector: dynamically-resizable vector with fixed capacity inplace storage |
__cpp_lib_constexpr_inplace_vector | 202502L | (C++26) | constexprstd::inplace_vector for non-trivial element types |
#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);// no placeassert(v1.back()==3);assert(v1.size()==4); v1.clear();assert(v1.size()==0);assert(v1.empty());}
| resizable contiguous array (class template)[edit] | |
(C++11) | fixed-sized inplace contiguous array (class template)[edit] |
| double-ended queue (class template)[edit] |
| 1. | inplace_vector — A reference implementation ofP0843R14 (std::inplace_vector). |
| 2. | static_vector — Boost.Container implements inplace vector as a standalone type with its own guarantees. |
| 3. | fixed_vector — EASTL implements inplace vector via an extra template parameter. |
| 4. | small_vector — Folly also implements inplace vector via an extra template parameter. |
| 5. | stack_alloc — Howard Hinnant's Custom allocators that emulatestd::inplace_vector on top ofstd::vector. |