Namespaces
Variants

std:: set

From cppreference.net
Определено в заголовочном файле <set>
template <

class Key,
class Compare = std:: less < Key > ,
class Allocator = std:: allocator < Key >

> class set ;
(1)
namespace pmr {

template <
class Key,
class Compare = std:: less < Key >
> using set = std :: set < Key, Compare, std:: pmr :: polymorphic_allocator < Key >> ;

}
(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 при вычислении константного выражения.

Однако, объекты std::set обычно не могут быть constexpr , поскольку любая динамически выделенная память должна быть освобождена в том же вычислении константного выражения.

(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

Allocator::pointer

(до C++11)

std:: allocator_traits < Allocator > :: pointer

(начиная с C++11)
const_pointer

Allocator::const_pointer

(до C++11)

std:: allocator_traits < Allocator > :: const_pointer

(начиная с C++11)
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 >
struct /*неопределено*/
{
Iter     position ;
bool inserted ;
NodeType node ;
} ;

инстанцированная с шаблонными аргументами iterator и node_type .

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

конструирует set
(public member function)
уничтожает set
(public member function)
присваивает значения контейнеру
(public member function)
возвращает связанный аллокатор
(публичная функция-член)
Итераторы
возвращает итератор на начало
(public member function)
(C++11)
возвращает итератор на конец
(публичная функция-член)
возвращает обратный итератор на начало
(публичная функция-член)
(C++11)
возвращает обратный итератор на конец
(публичная функция-член)
Ёмкость
проверяет, является ли контейнер пустым
(публичная функция-член)
возвращает количество элементов
(public member function)
возвращает максимально возможное количество элементов
(публичная функция-член)
Модификаторы
очищает содержимое
(публичная функция-член)
вставляет элементы или узлы (since C++17)
(публичная функция-член)
вставляет диапазон элементов
(публичная функция-член)
(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++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++23)
адаптирует контейнер для предоставления коллекции уникальных ключей, отсортированной по ключам
(шаблон класса)