std:: inplace_vector
|
Определено в заголовочном файле
<inplace_vector>
|
||
|
template
<
class
T,
|
(начиная с 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_vectors инвалидирует все итераторы (во время обмена итератор продолжит указывать на тот же элемент массива и может таким образом изменить своё значение).
Следующие функции-члены потенциально инвалидируют итераторы:
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]
|
резервирует память
(публичная статическая функция-член) |
|
[static]
|
уменьшает использование памяти за счет освобождения неиспользуемой памяти
(публичная статическая функция-член) |
Модификаторы |
|
|
вставляет элементы
(публичная функция-член) |
|
|
вставляет диапазон элементов
(публичная функция-член) |
|
|
создаёт элемент на месте
(публичная функция-член) |
|
|
создаёт элемент на месте в конце
(публичная функция-член) |
|
|
пытается создать элемент на месте в конце
(публичная функция-член) |
|
|
безусловно создаёт элемент на месте в конце
(публичная функция-член) |
|
|
добавляет элемент в конец
(public member function) |
|
|
пытается добавить элемент в конец
(публичная функция-член) |
|
|
безусловно добавляет элемент в конец
(публичная функция-член) |
|
|
удаляет последний элемент
(публичная функция-член) |
|
|
добавляет диапазон элементов в конец
(публичная функция-член) |
|
|
пытается добавить диапазон элементов в конец
(публичная функция-член) |
|
|
очищает содержимое
(публичная функция-член) |
|
|
удаляет элементы
(публичная функция-член) |
|
|
обменивает содержимое
(публичная функция-член) |
|
Функции, не являющиеся членами класса
|
(C++26)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции) |
|
|
(C++26)
|
лексикографически сравнивает значения двух
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
.
|