std:: set
|
Определено в заголовочном файле
<set>
|
||
|
template
<
class
Key,
|
(1) | |
|
namespace
pmr
{
template
<
|
(2) | (начиная с C++17) |
std::set
— это ассоциативный контейнер, содержащий отсортированное множество уникальных объектов типа
Key
. Сортировка выполняется с использованием функции сравнения ключей
Compare
. Операции поиска, удаления и вставки имеют логарифмическую сложность. Множества обычно реализуются как
красно-чёрные деревья
.
Везде, где стандартная библиотека использует требования Compare , уникальность определяется с использованием отношения эквивалентности. В упрощённой формулировке, два объекта a и b считаются эквивалентными, если ни один из них не меньше другого: ! comp ( a, b ) && ! comp ( b, a ) .
std::set
удовлетворяет требованиям
Container
,
AllocatorAwareContainer
,
AssociativeContainer
и
ReversibleContainer
.
Все функции-члены
std::set
являются
constexpr
: возможно создавать и использовать объекты
std::set
при вычислении константного выражения.
Однако, объекты
|
(since C++26) |
Содержание |
Параметры шаблона
|
Этот раздел не завершён
Причина: Добавьте описания параметров шаблона. |
Типы членов
| Тип | Определение | ||||
key_type
|
Key
|
||||
value_type
|
Key
|
||||
size_type
|
Беззнаковый целочисленный тип (обычно std::size_t ) | ||||
difference_type
|
Знаковый целочисленный тип (обычно std::ptrdiff_t ) | ||||
key_compare
|
Compare
|
||||
value_compare
|
Compare
|
||||
allocator_type
|
Allocator
|
||||
reference
|
value_type & | ||||
const_reference
|
const value_type & | ||||
pointer
|
|
||||
const_pointer
|
|
||||
iterator
|
Константный
LegacyBidirectionalIterator
и
ConstexprIterator
(начиная с C++26)
для
value_type
|
||||
const_iterator
|
LegacyBidirectionalIterator и ConstexprIterator (начиная с C++26) для const value_type | ||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > | ||||
node_type
(начиная с C++17)
|
специализация node handle , представляющая узел контейнера | ||||
insert_return_type
(начиная с C++17)
|
тип, описывающий результат вставки
node_type
, специализация
template
<
class
Iter,
class
NodeType
>
|
Функции-члены
конструирует
set
(public member function) |
|
уничтожает
set
(public member function) |
|
|
присваивает значения контейнеру
(public member function) |
|
|
возвращает связанный аллокатор
(публичная функция-член) |
|
Итераторы |
|
|
(C++11)
|
возвращает итератор на начало
(public member function) |
|
(C++11)
|
возвращает итератор на конец
(публичная функция-член) |
|
(C++11)
|
возвращает обратный итератор на начало
(публичная функция-член) |
|
(C++11)
|
возвращает обратный итератор на конец
(публичная функция-член) |
Ёмкость |
|
|
проверяет, является ли контейнер пустым
(публичная функция-член) |
|
|
возвращает количество элементов
(public member function) |
|
|
возвращает максимально возможное количество элементов
(публичная функция-член) |
|
Модификаторы |
|
|
очищает содержимое
(публичная функция-член) |
|
|
вставляет элементы
или узлы
(since C++17)
(публичная функция-член) |
|
|
(C++23)
|
вставляет диапазон элементов
(публичная функция-член) |
|
(C++11)
|
создаёт элемент на месте
(публичная функция-член) |
|
(C++11)
|
конструирует элементы на месте с использованием подсказки
(публичная функция-член) |
|
удаляет элементы
(публичная функция-член) |
|
|
обменивает содержимое
(публичная функция-член) |
|
|
(C++17)
|
извлекает узлы из контейнера
(публичная функция-член) |
|
(C++17)
|
объединяет узлы из другого контейнера
(публичная функция-член) |
Поиск |
|
|
возвращает количество элементов, соответствующих заданному ключу
(публичная функция-член) |
|
|
находит элемент с заданным ключом
(public member function) |
|
|
(C++20)
|
проверяет, содержит ли контейнер элемент с указанным ключом
(публичная функция-член) |
|
возвращает диапазон элементов, соответствующих определённому ключу
(публичная функция-член) |
|
|
возвращает итератор на первый элемент
не меньший
чем заданный ключ
(публичная функция-член) |
|
|
возвращает итератор на первый элемент
больший
чем заданный ключ
(публичная функция-член) |
|
Наблюдатели |
|
|
возвращает функцию, которая сравнивает ключи
(публичная функция-член) |
|
возвращает функцию, которая сравнивает ключи в объектах типа
value_type
(публичная функция-член) |
|
Функции, не являющиеся членами класса
|
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(удалено в C++20)
(C++20)
|
лексикографически сравнивает значения двух
set
ов
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
(C++20)
|
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции) |
Руководства по выводу |
(начиная с C++17) |
Примечания
Типы-члены
iterator
и
const_iterator
могут быть псевдонимами одного и того же типа. Это означает, что определение пары перегруженных функций, использующих эти два типа в качестве типов параметров, может нарушать
Правило Одного Определения
. Поскольку
iterator
конвертируется в
const_iterator
, вместо этого будет работать единственная функция с параметром типа
const_iterator
.
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | Конструирование и вставка диапазонов для контейнеров |
__cpp_lib_constexpr_set
|
202502L
|
(C++26) |
constexpr
std::set
|
Пример
#include <algorithm> #include <iomanip> #include <iostream> #include <iterator> #include <set> #include <string_view> template<typename T> std::ostream& operator<<(std::ostream& out, const std::set<T>& set) { if (set.empty()) return out << "{}"; out << "{ " << *set.begin(); std::for_each(std::next(set.begin()), set.end(), [&out](const T& element) { out << ", " << element; }); return out << " }"; } int main() { std::set<int> set{1, 5, 3}; std::cout << set << '\n'; set.insert(2); std::cout << set << '\n'; set.erase(1); std::cout << set << "\n\n"; std::set<int> keys{3, 4}; for (int key : keys) { if (set.contains(key)) std::cout << set << " содержит " << key << '\n'; else std::cout << set << " не содержит " << key << '\n'; } std::cout << '\n'; std::string_view word = "element"; std::set<char> characters(word.begin(), word.end()); std::cout << "В слове " << std::quoted(word) << " содержится " << characters.size() << " уникальных символов:\n" << characters << '\n'; }
Вывод:
{ 1, 3, 5 }
{ 1, 2, 3, 5 }
{ 2, 3, 5 }
{ 2, 3, 5 } содержит 3
{ 2, 3, 5 } не содержит 4
В слове "element" содержится 5 уникальных символов:
{ e, l, m, n, t }
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 103 | C++98 | iterator allows modification of keys | iterator made constant |
| LWG 230 | C++98 |
Key
was not required to be
CopyConstructible
(a key of type
Key
might not be able to be constructed)
|
Key
is also required to
be CopyConstructible |
Смотрите также
|
коллекция ключей, отсортированная по ключам
(шаблон класса) |
|
|
(C++11)
|
коллекция уникальных ключей, хэшированная по ключам
(шаблон класса) |
|
(C++23)
|
адаптирует контейнер для предоставления коллекции уникальных ключей, отсортированной по ключам
(шаблон класса) |