std::inplace_vector - cppreference.com (original) (raw)

inplace_vector is a dynamically-resizable array with contiguous inplace storage. The elements of type T are stored and properly aligned within the object itself. The capacity of the internal storage is fixed at compile-time and is equal to N.

The elements are stored contiguously, which means that elements can be accessed not only through iterators or random-access operator[], but also using offsets to regular pointers to elements. A pointer to an element of an inplace_vector may be passed to any function that expects a pointer to an element of a C-array.

The inplace_vector models Container, ReversibleContainer, ContiguousContainer, and SequenceContainer, including most of the optional sequence container requirements, except that the push_front, emplace_front, pop_front, and prepend_range member functions are not provided.

For any positive N, std::inplace_vector<T, N>::iterator and std::inplace_vector<T, N>::const_iterator meet the ConstexprIterator requirements.

The specialization std::inplace_vector<T, 0> is TriviallyCopyable and is empty. std::is_trivially_default_constructible_v<std::inplace_vector<T, 0>> is also true.

Any member function of std::inplace_vector<T, N> that would cause insertion beyond the capacity N throws std::bad_alloc.

The complexity of common operations on inplace_vectors is as follows:

Contents

[edit] Iterator invalidation

std::inplace_vector iterator invalidation guarantees differ from std::vector:

The following member functions potentially invalidate iterators:operator=, assign, assign_range, clear, emplace, erase, insert, insert_range, pop_back, resize, and swap.

The following member functions potentially invalidate end iterator only:append_range, emplace_back, push_back, try_append_range, try_emplace_back, try_push_back, unchecked_emplace_back, and unchecked_push_back.

[edit] Template parameters

[edit] Member types

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-defined LegacyRandomAccessIterator and random_access_iterator to value_type[edit]
const_iterator implementation-defined LegacyRandomAccessIterator, ConstexprIterator(since C++26) and random_access_iterator to const value_type[edit]
reverse_iterator std::reverse_iterator<iterator>[edit]
const_reverse_iterator std::reverse_iterator<const_iterator>[edit]

[edit] Member functions

(constructor) constructs the inplace_vector (public member function) [edit]
(destructor) destructs the inplace_vector (public member function) [edit]
operator= assigns values to the container (public member function) [edit]
assign assigns values to the container (public member function) [edit]
assign_range assigns a range of values to the container (public member function) [edit]
Element access
at access specified element with bounds checking (public member function) [edit]
operator[] access specified element (public member function) [edit]
front access the first element (public member function) [edit]
back access the last element (public member function) [edit]
data direct access to the underlying contiguous storage (public member function) [edit]
Iterators
begincbegin returns an iterator to the beginning (public member function) [edit]
endcend returns an iterator to the end (public member function) [edit]
rbegincrbegin returns a reverse iterator to the beginning (public member function) [edit]
rendcrend returns a reverse iterator to the end (public member function) [edit]
Size and capacity
empty checks whether the container is empty (public member function) [edit]
size returns the number of elements (public member function) [edit]
max_size[static] returns the maximum possible number of elements (public static member function) [edit]
capacity[static] returns the number of elements that can be held in currently allocated storage (public static member function) [edit]
resize changes the number of elements stored (public member function) [edit]
reserve[static] reserves storage (public static member function) [edit]
shrink_to_fit[static] reduces memory usage by freeing unused memory (public static member function) [edit]
Modifiers
insert inserts elements (public member function) [edit]
insert_range inserts a range of elements (public member function) [edit]
emplace constructs element in-place (public member function) [edit]
emplace_back constructs an element in-place at the end (public member function) [edit]
try_emplace_back tries to construct an element in-place at the end (public member function) [edit]
unchecked_emplace_back unconditionally constructs an element in-place at the end (public member function) [edit]
push_back adds an element to the end (public member function) [edit]
try_push_back tries to add an element to the end (public member function) [edit]
unchecked_push_back unconditionally adds an element to the end (public member function) [edit]
pop_back removes the last element (public member function) [edit]
append_range adds a range of elements to the end (public member function) [edit]
try_append_range tries to add a range of elements to the end (public member function) [edit]
clear clears the contents (public member function) [edit]
erase erases elements (public member function) [edit]
swap swaps the contents (public member function) [edit]

[edit] Non-member functions

[edit] Notes

The number of elements in a inplace_vector may vary dynamically up to a fixed capacity because elements are stored within the object itself similarly to std::array. However, objects are initialized as they are inserted into inplace_vector unlike C arrays or std::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) constexpr std::inplace_vector for non-trivial element types

[edit] Example

#include #include #include #include   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 place assert(v1.back() == 3); assert(v1.size() == 4); v1.clear(); assert(v1.size() == 0); assert(v1.empty()); }

[edit] See also

| | resizable contiguous array (class template) [edit] | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | | fixed-sized inplace contiguous array (class template) [edit] | | | double-ended queue (class template) [edit] |

1. inplace_vector — A reference implementation of P0843R14 (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 emulate std::inplace_vector on top of std::vector.