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