Spec-Zone.ru › C++

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.

Стандартные контейнеры std::vector и std::deque удовлетворяют этим требованиям.

Типы членов

Тип члена Определение
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
(публичный метод-член)
operator=
присваивает значения адаптеру контейнера
(публичный метод-член)
Итераторы
begincbegin
возвращает итератор к началу
(публичный метод-член)
endcend
возвращает итератор к концу
(публичный метод-член)
rbegincrbegin
возвращает обратный итератор к началу
(публичный метод-член)
rendcrend
возвращает обратный итератор к концу
(публичный метод-член)
Ёмкость
empty
проверяет, пуст ли адаптер контейнера
(публичный метод-член)
size
возвращает количество элементов
(публичный метод-член)
max_size
возвращает максимальное возможное количество элементов
(публичный метод-член)
Модификаторы
emplace
создаёт элемент на месте
(публичный метод-член)
emplace_hint
создаёт элемент на месте с использованием подсказки
(публичный метод-член)
insert
вставляет элементы
(публичный метод-член)
insert_range
вставляет диапазон элементов
(публичный метод-член)
extract
извлекает базовый контейнер
(публичный метод-член)
replace
заменяет базовый контейнер
(публичный метод-член)
erase
удаляет элементы
(публичный метод-член)
swap
меняет содержимое
(публичный метод-член)
clear
очищает содержимое
(публичный метод-член)
Поиск
find
находит элемент с заданным ключом
(публичный метод-член)
count
возвращает количество элементов, соответствующих заданному ключу
(публичный метод-член)
contains
проверяет, содержит ли контейнер элемент с заданным ключом
(публичный метод-член)
lower_bound
возвращает итератор к первому элементу, не меньше заданного ключа
(публичный метод-член)
upper_bound
возвращает итератор к первому элементу, больше заданного ключа
(публичный метод-член)
equal_range
возвращает диапазон элементов, соответствующих заданному ключу
(публичный метод-член)
Наблюдатели
key_comp
возвращает функцию сравнения ключей
(публичный метод-член)
value_comp
возвращает функцию сравнения ключей в объектах типа value_type
(публичный метод-член)

Нечленные функции

оператор==оператор<=>
(C++23)
лексикографически сравнивает значения двух flat_sets
(шаблон функции)
std::swap(std::flat_set)
(C++23)
специализирует алгоритм std::swap
(шаблон функции)
erase_if(std::flat_set)
(C++23)
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции)

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

std::uses_allocator<std::flat_set>
(C++23)
специализирует тип-трейт std::uses_allocator
(специализация шаблонного класса)

Метки

sorted_uniquesorted_unique_t
(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

Пример

См. также

flat_multiset
(C++23)
адаптирует контейнер для предоставления набора ключей, отсортированных по ключам
(шаблон класса)
set
набор уникальных ключей, отсортированных по ключам
(шаблон класса)
unordered_set
(C++11)
набор уникальных ключей, хешированных по ключам
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/flat_set

Spec-Zone.ru

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