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;
(начиная с C++23)

Плоское множество — это адаптер контейнера, предоставляющий функциональность ассоциативного контейнера, в котором хранится отсортированный набор уникальных объектов типа Key. Сортировка выполняется с помощью функции сравнения ключей Compare.

Шаблон класса flat_set служит оболочкой для базового отсортированного контейнера, передаваемого как объект типа KeyContainer.

Везде, где стандартная библиотека использует требования Compare, уникальность определяется с помощью отношения эквивалентности. Неформально, два объекта a и b считаются эквивалентными, если ни один из них не сравнивается как меньший другого: !comp(a, b) && !comp(b, a).

std::flat_set соответствует требованиям Container, ReversibleContainer, необязательным требованиям к контейнерам и всем требованиям AssociativeContainer (включая логарифмическую сложность поиска), за исключением следующего:

  • требования, относящиеся к узлам, неприменимы;
  • требования к инвалидированию итераторов отличаются;
  • сложность операций вставки и удаления линейна.

Плоское множество поддерживает большинство операций AssociativeContainer, использующих уникальные ключи.

Все функции-члены std::flat_set являются constexpr: объекты std::flat_set можно создавать и использовать при вычислении константного выражения.

Однако определение переменной constexpr std::flat_set обычно приводит к ошибке, поскольку при константном вычислении требуется освободить любое динамически выделенное хранилище в рамках того же вычисления, что обычно не происходит при инициализации std::flat_set.

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

Инвалидирование итераторов

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

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 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) объект функции сравнения
(объект-член, используемый только для описания*)

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

(constructor)
создаёт flat_set
(открытая функция-член)
(destructor)
(implicitly declared)
уничтожает каждый элемент адаптера контейнера
(открытая функция-член)
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
(открытая функция-член)

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

operator==operator<=>
(C++23)
лексикографически сравнивает значения двух объектов flat_set
(шаблон функции)
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.

Некоторые преимущества плоского множества по сравнению с другими стандартными адаптерами контейнеров:

  • Потенциально более быстрый поиск (несмотря на логарифмическую сложность операций поиска).
  • Значительно более быстрая итерация: итераторы произвольного доступа вместо двунаправленных итераторов.
  • Меньшее потребление памяти для небольших объектов (а также для больших объектов, если доступен 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

Пример

См. также

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/cpp/container/flat_set

Spec-Zone.ru

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