std::flat_set
Определён в заголовочном файле <flat_set> | ||
|---|---|---|
template<
class Key,
class Compare = std::less<Key>,
class KeyContainer = std::vector<Key>
> class flat_set;
| (начиная с C++23) |
Плоское множество — это адаптер контейнера, предоставляющий функциональность ассоциативного контейнера, в котором хранится отсортированный набор уникальных объектов типа Key. Сортировка выполняется с помощью функции сравнения ключей Compare.
Шаблон класса flat_set служит оболочкой для базового отсортированного контейнера, передаваемого как объект типа KeyContainer.
Везде, где стандартная библиотека использует требования Compare, уникальность определяется с помощью отношения эквивалентности. Неформально, два объекта a и b считаются эквивалентными, если ни один из них не сравнивается как меньший другого: !comp(a, b) && !comp(b, a).
std::flat_set соответствует требованиям Container, ReversibleContainer, необязательным требованиям к контейнерам и всем требованиям AssociativeContainer (включая логарифмическую сложность поиска), за исключением следующего:
- требования, относящиеся к узлам, неприменимы;
- требования к инвалидированию итераторов отличаются;
- сложность операций вставки и удаления линейна.
Плоское множество поддерживает большинство операций AssociativeContainer, использующих уникальные ключи.
| Все функции-члены Однако определение переменной constexpr | (начиная с C++26) |
Инвалидирование итераторов
Параметры шаблона
| Key | - | Тип хранимых элементов. Программа некорректна, если Key не является тем же типом, что и KeyContainer::value_type. |
| Compare | - | Тип Compare, задающий строгое слабое упорядочение. |
| KeyContainer | - | Тип базового SequenceContainer, в котором хранятся элементы. Итераторы такого контейнера должны соответствовать требованиям LegacyRandomAccessIterator или моделировать random_access_iterator. Стандартные контейнеры |
Типы-члены
| Тип | Определение |
|---|---|
container_type |
KeyContainer |
key_type |
Key |
value_type |
Key |
key_compare |
Compare |
value_compare |
Compare |
reference | value_type& |
const_reference | constvalue_type& |
size_type | typenameKeyContainer::size_type |
difference_type | typenameKeyContainer::difference_type |
iterator | определяемый реализацией LegacyRandomAccessIterator, ConstexprIterator(начиная с C++26) и random_access_iterator для value_type |
const_iterator | определяемый реализацией LegacyRandomAccessIterator, ConstexprIterator(начиная с C++26) и random_access_iterator для constvalue_type |
reverse_iterator | std::reverse_iterator<iterator> |
const_reverse_iterator | std::reverse_iterator<const_iterator> |
Объекты-члены
| Член | Описание |
|---|---|
container_type c (private) | адаптированный контейнер (объект-член, используемый только для описания*) |
key_compare compare (private) | объект функции сравнения (объект-член, используемый только для описания*) |
Функции-члены
создаёт flat_set (открытая функция-член) |
|
|
(destructor)
(implicitly declared) | уничтожает каждый элемент адаптера контейнера (открытая функция-член) |
| присваивает значения адаптеру контейнера (открытая функция-член) |
|
Итераторы |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор на конец (открытая функция-член) |
|
| возвращает обратный итератор на начало (открытая функция-член) |
|
| возвращает обратный итератор на конец (открытая функция-член) |
|
Ёмкость |
|
| проверяет, пуст ли адаптер контейнера (открытая функция-член) |
|
| возвращает количество элементов (открытая функция-член) |
|
| возвращает максимально возможное количество элементов (открытая функция-член) |
|
Модификаторы |
|
| создаёт элемент на месте (открытая функция-член) |
|
| создаёт элементы на месте, используя подсказку (открытая функция-член) |
|
| вставляет элементы (открытая функция-член) |
|
| вставляет диапазон элементов (открытая функция-член) |
|
| извлекает базовый контейнер (открытая функция-член) |
|
| заменяет базовый контейнер (открытая функция-член) |
|
| удаляет элементы (открытая функция-член) |
|
| обменивает содержимое (открытая функция-член) |
|
| очищает содержимое (открытая функция-член) |
|
Поиск |
|
| находит элемент с заданным ключом (открытая функция-член) |
|
| возвращает количество элементов с заданным ключом (открытая функция-член) |
|
| проверяет, содержит ли контейнер элемент с заданным ключом (открытая функция-член) |
|
| возвращает итератор на первый элемент, который не меньше заданного ключа (открытая функция-член) |
|
| возвращает итератор на первый элемент, который больше заданного ключа (открытая функция-член) |
|
| возвращает диапазон элементов с заданным ключом (открытая функция-член) |
|
Наблюдатели |
|
| возвращает функцию сравнения ключей (открытая функция-член) |
|
возвращает функцию сравнения ключей в объектах типа value_type (открытая функция-член) |
|
Функции, не являющиеся членами
|
(C++23) | лексикографически сравнивает значения двух объектов flat_set (шаблон функции) |
|
(C++23) | специализирует алгоритм std::swap (шаблон функции) |
|
(C++23) | удаляет все элементы, удовлетворяющие заданному критерию (шаблон функции) |
Вспомогательные классы
|
(C++23) | специализирует характеристику типа std::uses_allocator (частичная специализация шаблона класса) |
Теги
|
(C++23) | указывает, что элементы диапазона отсортированы и уникальны (тег) |
Руководства по выведению аргументов шаблона
Примечания
Типы-члены iterator и const_iterator могут быть псевдонимами одного и того же типа. Это означает, что определение пары перегруженных функций, использующих эти два типа в качестве типов параметров, может нарушать правило одного определения. Поскольку iterator преобразуется в const_iterator, вместо этого подойдёт одна функция с параметром типа const_iterator.
Некоторые преимущества плоского множества по сравнению с другими стандартными адаптерами контейнеров:
- Потенциально более быстрый поиск (несмотря на логарифмическую сложность операций поиска).
- Значительно более быстрая итерация: итераторы произвольного доступа вместо двунаправленных итераторов.
- Меньшее потребление памяти для небольших объектов (а также для больших объектов, если доступен
KeyContainer::shrink_to_fit()). - Более эффективное использование кэша (в зависимости от
KeyContainer, ключи хранятся в одном или нескольких непрерывных блоках памяти).
Некоторые недостатки плоского множества:
- Итераторы нестабильны (вставка и удаление элементов инвалидируют итераторы).
- Нельзя хранить значения типов, которые нельзя копировать или перемещать.
- Более слабые гарантии безопасности исключений (конструкторы копирования и перемещения могут выбрасывать исключения при сдвиге значений во время удаления и вставки).
- Более медленные (то есть линейные) операции вставки и удаления, особенно для типов, которые нельзя перемещать.
| Макрос проверки поддержки функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_flat_set | 202207L | (C++23) |
std::flat_set и std::flat_multiset |
__cpp_lib_constexpr_flat_set | 202502L | (C++26) | std::flat_set с поддержкой constexpr |
Пример
См. также
|
(C++23) | адаптирует контейнер, предоставляя коллекцию ключей, отсортированных по ключам (шаблон класса) |
| коллекция уникальных ключей, отсортированных по ключам (шаблон класса) |
|
|
(C++11) | коллекция уникальных ключей с хешированием по ключам (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/flat_set