Namespaces
Variants

std:: inplace_vector

From cppreference.net
Определено в заголовочном файле <inplace_vector>
template <

class T,
std:: size_t N

> struct inplace_vector ;
(начиная с C++26)

inplace_vector — это динамически изменяемый массив с непрерывным внутренним хранилищем. Элементы типа 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 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 (начиная с C++26) и 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 : динамически изменяемый вектор с фиксированной ёмкостью встроенного хранилища
__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());
}

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

изменяемый непрерывный массив
(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 .