Namespaces
Variants

std::inplace_vector

С ru.cppreference.net
 
 
 
 
Определён в заголовке <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).

Инвалидация итераторов

std::inplace_vector гарантии инвалидации итераторов отличаются от std::vector :

  • перемещение inplace_vector инвалидирует все итераторы;
  • обмен двух inplace_vector s инвалидирует все итераторы (во время обмена итератор продолжит указывать на тот же элемент массива и может таким образом изменить своё значение).

Следующие функции-члены потенциально инвалидируют итераторы: 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
(публичная функция-член)
уничтожает объект inplace_vector
(публичная функция-член)
присваивает значения контейнеру
(публичная функция-член)
присваивает значения контейнеру
(публичная функция-член)
присваивает диапазон значений контейнеру
(публичная функция-член)
Доступ к элементам
доступ к указанному элементу с проверкой границ
(public member function)
доступ к указанному элементу
(публичная функция-член)
доступ к первому элементу
(публичная функция-член)
доступ к последнему элементу
(публичная функция-член)
прямой доступ к базовому непрерывному хранилищу
(публичная функция-член)
Итераторы
возвращает итератор на начало
(публичная функция-член)
возвращает итератор на конец
(публичная функция-член)
возвращает обратный итератор на начало
(публичная функция-член)
возвращает обратный итератор на конец
(публичная функция-член)
Размер и ёмкость
проверяет, является ли контейнер пустым
(публичная функция-член)
возвращает количество элементов
(публичная функция-член)
[static]
возвращает максимально возможное количество элементов
(публичная статическая функция-член)
[static]
возвращает количество элементов, которое может содержаться в текущем выделенном хранилище
(публичная статическая функция-член)
изменяет количество хранимых элементов
(публичная функция-член)
[static]
резервирует память
(публичная статическая функция-член)
уменьшает использование памяти за счет освобождения неиспользуемой памяти
(публичная статическая функция-член)
Модификаторы
вставляет элементы
(публичная функция-член)
вставляет диапазон элементов
(публичная функция-член)
создаёт элемент на месте
(публичная функция-член)
создаёт элемент на месте в конце
(публичная функция-член)
пытается создать элемент на месте в конце
(публичная функция-член)
безусловно создаёт элемент на месте в конце
(публичная функция-член)
добавляет элемент в конец
(public member function)
пытается добавить элемент в конец
(публичная функция-член)
безусловно добавляет элемент в конец
(публичная функция-член)
удаляет последний элемент
(публичная функция-член)
добавляет диапазон элементов в конец
(публичная функция-член)
пытается добавить диапазон элементов в конец
(публичная функция-член)
очищает содержимое
(публичная функция-член)
удаляет элементы
(публичная функция-член)
обменивает содержимое
(публичная функция-член)

Функции, не являющиеся членами класса

специализирует алгоритм std::swap
(шаблон функции)
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции)
лексикографически сравнивает значения двух 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)std::inplace_vectorConstexpr
для нетривиальных типов элементов

Пример

#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());
}

Смотрите также

изменяемый непрерывный массив
(class template)
(C++11)
массив фиксированного размера с размещением в памяти
(class template)
двусторонняя очередь
(class template)

Внешние ссылки

1. inplace_vector — Референсная реализация P0843R14 ( std::inplace_vector ).
2. static_vector — Boost.Container реализует inplace vector как отдельный тип со своими гарантиями.
3. fixed_vector — EASTL реализует inplace vector через дополнительный параметр шаблона.
4. small_vector — Folly также реализует inplace vector через дополнительный параметр шаблона.
5. stack_alloc — Пользовательские аллокаторы Howard Hinnant, которые эмулируют std::inplace_vector поверх std::vector .