std::hive
Определён в заголовочном файле <hive> | ||
|---|---|---|
template<
class T,
class Allocator = std::allocator<T>
> class hive;
| (1) | (начиная с C++26) |
namespace pmr {
template<class T>
using hive = std::hive<T, std::pmr::polymorphic_allocator<T>>;
}
| (2) | (начиная с C++26) |
std::hive — это контейнер-последовательность, обеспечивающий операции вставки и удаления с постоянной сложностью.Контейнер hive автоматически управляет своей памятью в нескольких блоках (блоках элементов). Позиция вставки не определена, поэтому контейнер может повторно использовать ячейки памяти удалённых элементов.
Когда активные блоки (блоки элементов, содержащие элементы) становятся пустыми, их можно освободить или превратить в резервные блоки.
Резервные блоки становятся активными при повторном использовании для хранения элементов. Пользователь может создать дополнительные резервные блоки, вызвав reserve().
Удаление и итерация имеют постоянную сложность.
Ёмкость каждого активного блока увеличивается в соответствии с коэффициентом, определяемым реализацией (например, на 1.69). Пользователи и реализации могут ограничивать минимальную и максимальную ёмкость блоков элементов.
std::hive соответствует требованиям контейнера, за исключением операторов == и !=. std::hive также удовлетворяет требованиям обратимого контейнера, контейнера с поддержкой аллокатора и некоторым требованиям контейнера-последовательности.
Параметры шаблона
| T | - | Тип элементов.
|
||
| Allocator | - | Аллокатор, используемый для выделения и освобождения памяти, а также для создания и уничтожения элементов в этой памяти. Тип должен удовлетворять требованиям Allocator. Программа некорректна, если Allocator::value_type не совпадает с T. |
Типы-члены
| Тип-член | Определение |
|---|---|
value_type |
T |
allocator_type |
Allocator |
pointer | std::allocator_traits<Allocator>::pointer |
const_pointer | std::allocator_traits<Allocator>::const_pointer |
reference | value_type& |
const_reference | constvalue_type& |
size_type | определяется реализацией |
difference_type | определяется реализацией |
iterator | LegacyBidirectionalIterator, определяемый реализацией, для value_type |
const_iterator | LegacyBidirectionalIterator, определяемый реализацией, для constvalue_type |
reverse_iterator | std::reverse_iterator<iterator> |
const_reverse_iterator | std::reverse_iterator<const_iterator> |
Переменные-члены
| Член | Описание |
|---|---|
hive_limits current-limits (закрытый) | текущие ограничения ёмкости блока (объект-член только для пояснения*) |
Функции-члены
создаёт hive (открытая функция-член) |
|
уничтожает hive (открытая функция-член) |
|
| присваивает значения контейнеру (открытая функция-член) |
|
| присваивает значения контейнеру (открытая функция-член) |
|
| присваивает контейнеру диапазон значений (открытая функция-член) |
|
| возвращает связанный аллокатор (открытая функция-член) |
|
Итераторы |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор на конец (открытая функция-член) |
|
| возвращает обратный итератор на начало (открытая функция-член) |
|
| возвращает обратный итератор на конец (открытая функция-член) |
|
Ёмкость |
|
| проверяет, пуст ли контейнер (открытая функция-член) |
|
| возвращает количество элементов (открытая функция-член) |
|
| возвращает максимально возможное количество элементов (открытая функция-член) |
|
| возвращает количество элементов, помещающихся в выделенную на данный момент память (открытая функция-член) |
|
| резервирует память (открытая функция-член) |
|
| уменьшает использование памяти, освобождая неиспользуемую память (открытая функция-член) |
|
| освобождает резервные блоки и соответственно уменьшает ёмкость (открытая функция-член) |
|
| возвращает текущие ограничения ёмкости блока (открытая функция-член) |
|
|
[static] | возвращает ограничения ёмкости блока по умолчанию (открытая статическая функция-член) |
|
[static] | возвращает жёсткие ограничения ёмкости блока (открытая статическая функция-член) |
|
[static] | проверяет, соблюдаются ли заданные жёсткие ограничения ёмкости (открытая статическая функция-член) |
| перераспределяет память активных блоков, чтобы они соответствовали ограничениям блоков (открытая функция-член) |
Модификаторы |
|
| создаёт элемент на месте (открытая функция-член) |
|
| вставляет элементы (открытая функция-член) |
|
| вставляет диапазон элементов (открытая функция-член) |
|
| удаляет элементы (открытая функция-член) |
|
| обменивает содержимое (открытая функция-член) |
|
| очищает содержимое (открытая функция-член) |
|
Операции |
|
перемещает элементы из другого hive (открытая функция-член) |
|
| удаляет соседние повторяющиеся элементы (открытая функция-член) |
|
| сортирует элементы (открытая функция-член) |
|
| возвращает итератор, указывающий на тот же элемент, что и заданный указатель (открытая функция-член) |
|
Функции, не являющиеся членами
|
(C++26) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++26) | удаляет все элементы, удовлетворяющие заданным критериям (шаблон функции) |
Руководства по выводу типов | (начиная с C++26) |
Вспомогательные классы
|
(C++26) | информация о структуре ограничений ёмкости блоков в std::hive (класс) |
Примечания
| Макрос проверки поддержки функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_hive | 202502L | (C++26) |
std::hive |
Пример
#include <chrono>
#include <hive>
#include <iomanip>
#include <iostream>
#include <list>
int main()
{
constexpr auto iterations{10'000'000};
auto benchmark = [=](auto& container, auto rem)
{
const auto t0{std::chrono::system_clock::now()};
auto it{container.cbegin()};
for (auto n{0}; n != iterations; ++n)
container.insert(it, n);
while (container.size())
container.erase(container.begin());
const std::chrono::duration<double> diff{std::chrono::system_clock::now() - t0};
std::cout << std::fixed << std::setprecision(3) << diff << rem << std::endl;
};
std::list<std::size_t> list;
benchmark(list, " (cold list)");
benchmark(list, " (warm list)");
std::hive<std::size_t> hive;
benchmark(hive, " (cold hive)");
benchmark(hive, " (warm hive)");
}
Возможный вывод:
0.684s (cold list) 0.481s (warm list) 0.302s (cold hive) 0.176s (warm hive)
См. также
| двусвязный список (шаблон класса) |
Внешние ссылки
| 1. |
plf::hive — эталонная реализация на github.com |
| 2. | Пчелиный улей в Википедии |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/hive