std::inplace_vector
| Определён в заголовке <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_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 и 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: вектор с динамическим изменением размера и фиксированной ёмкостью, хранящийся на месте
|
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
.
|