Spec-Zone.ru › C++

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)
1) std::hive — это контейнер-последовательность, обеспечивающий операции вставки и удаления с постоянной сложностью.
2) std::pmr::hive — это псевдоним шаблона, использующий полиморфный аллокатор.

Контейнер hive автоматически управляет своей памятью в нескольких блоках (блоках элементов). Позиция вставки не определена, поэтому контейнер может повторно использовать ячейки памяти удалённых элементов.

Когда активные блоки (блоки элементов, содержащие элементы) становятся пустыми, их можно освободить или превратить в резервные блоки.

Резервные блоки становятся активными при повторном использовании для хранения элементов. Пользователь может создать дополнительные резервные блоки, вызвав reserve().

Удаление и итерация имеют постоянную сложность.

Ёмкость каждого активного блока увеличивается в соответствии с коэффициентом, определяемым реализацией (например, на 1.69). Пользователи и реализации могут ограничивать минимальную и максимальную ёмкость блоков элементов.

std::hive соответствует требованиям контейнера, за исключением операторов == и !=. std::hive также удовлетворяет требованиям обратимого контейнера, контейнера с поддержкой аллокатора и некоторым требованиям контейнера-последовательности.

Параметры шаблона

T - Тип элементов.
Требования к элементам зависят от фактически выполняемых над контейнером операций. Как правило, тип элемента должен быть полным и удовлетворять требованиям Erasable, однако многие функции-члены предъявляют более строгие требования.
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 (закрытый) текущие ограничения ёмкости блока
(объект-член только для пояснения*)

Функции-члены

(constructor)
создаёт hive
(открытая функция-член)
(destructor)
уничтожает hive
(открытая функция-член)
operator=
присваивает значения контейнеру
(открытая функция-член)
assign
присваивает значения контейнеру
(открытая функция-член)
assign_range
присваивает контейнеру диапазон значений
(открытая функция-член)
get_allocator
возвращает связанный аллокатор
(открытая функция-член)
Итераторы
begincbegin
возвращает итератор на начало
(открытая функция-член)
endcend
возвращает итератор на конец
(открытая функция-член)
rbegincrbegin
возвращает обратный итератор на начало
(открытая функция-член)
rendcrend
возвращает обратный итератор на конец
(открытая функция-член)
Ёмкость
empty
проверяет, пуст ли контейнер
(открытая функция-член)
size
возвращает количество элементов
(открытая функция-член)
max_size
возвращает максимально возможное количество элементов
(открытая функция-член)
capacity
возвращает количество элементов, помещающихся в выделенную на данный момент память
(открытая функция-член)
reserve
резервирует память
(открытая функция-член)
shrink_to_fit
уменьшает использование памяти, освобождая неиспользуемую память
(открытая функция-член)
trim_capacity
освобождает резервные блоки и соответственно уменьшает ёмкость
(открытая функция-член)
block_capacity_limits
возвращает текущие ограничения ёмкости блока
(открытая функция-член)
block_capacity_default_limits
[static]
возвращает ограничения ёмкости блока по умолчанию
(открытая статическая функция-член)
block_capacity_hard_limits
[static]
возвращает жёсткие ограничения ёмкости блока
(открытая статическая функция-член)
is_within_hard_limits
[static]
проверяет, соблюдаются ли заданные жёсткие ограничения ёмкости
(открытая статическая функция-член)
reshape
перераспределяет память активных блоков, чтобы они соответствовали ограничениям блоков
(открытая функция-член)
Модификаторы
emplaceemplace_hint
создаёт элемент на месте
(открытая функция-член)
insert
вставляет элементы
(открытая функция-член)
insert_range
вставляет диапазон элементов
(открытая функция-член)
erase
удаляет элементы
(открытая функция-член)
swap
обменивает содержимое
(открытая функция-член)
clear
очищает содержимое
(открытая функция-член)
Операции
splice
перемещает элементы из другого hive
(открытая функция-член)
unique
удаляет соседние повторяющиеся элементы
(открытая функция-член)
sort
сортирует элементы
(открытая функция-член)
get_iterator
возвращает итератор, указывающий на тот же элемент, что и заданный указатель
(открытая функция-член)

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

std::swap(std::hive)
(C++26)
специализирует алгоритм std::swap
(шаблон функции)
erase(std::hive)erase_if(std::hive)
(C++26)
удаляет все элементы, удовлетворяющие заданным критериям
(шаблон функции)

Руководства по выводу типов

(начиная с C++26)

Вспомогательные классы

hive_limits
(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)

См. также

list
двусвязный список
(шаблон класса)

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

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API