std::set
Определён в заголовочном файле <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.
| Все функции-члены Однако определение переменной constexpr | (начиная с 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 | constvalue_type& | ||||
pointer |
|
||||
const_pointer |
|
||||
iterator | Константный LegacyBidirectionalIterator и ConstexprIterator(начиная с C++26) к value_type |
||||
const_iterator | LegacyBidirectionalIterator и ConstexprIterator(начиная с C++26) к constvalue_type | ||||
reverse_iterator | std::reverse_iterator<iterator> | ||||
const_reverse_iterator | std::reverse_iterator<const_iterator> | ||||
node_type (начиная с C++17) | специализация дескриптора узла, представляющая узел контейнера | ||||
insert_return_type (начиная с C++17) | тип, описывающий результат вставки node_type, специализация template< class Iter, class NodeType >
struct /* unspecified */
{
Iter position;
bool inserted;
NodeType node;
};
с аргументами шаблона |
Функции-члены
создаёт set (открытая функция-член) |
|
уничтожает set (открытая функция-член) |
|
| присваивает контейнеру значения (открытая функция-член) |
|
| возвращает связанный с контейнером распределитель памяти (открытая функция-член) |
|
Итераторы |
|
|
(C++11) | возвращает итератор на начало (открытая функция-член) |
|
(C++11) | возвращает итератор на конец (открытая функция-член) |
|
(C++11) | возвращает обратный итератор на начало (открытая функция-член) |
|
(C++11) | возвращает обратный итератор на конец (открытая функция-член) |
Ёмкость |
|
| проверяет, пуст ли контейнер (открытая функция-член) |
|
| возвращает количество элементов (открытая функция-член) |
|
| возвращает максимально возможное количество элементов (открытая функция-член) |
|
Модификаторы |
|
| очищает содержимое (открытая функция-член) |
|
| вставляет элементы или узлы(начиная с C++17) (открытая функция-член) |
|
|
(C++23) | вставляет диапазон элементов (открытая функция-член) |
|
(C++11) | создаёт элемент на месте (открытая функция-член) |
|
(C++11) | создаёт элементы на месте, используя подсказку (открытая функция-член) |
| удаляет элементы (открытая функция-член) |
|
| обменивает содержимое (открытая функция-член) |
|
|
(C++17) | извлекает узлы из контейнера (открытая функция-член) |
|
(C++17) | перемещает узлы из другого контейнера (открытая функция-член) |
Поиск |
|
| возвращает количество элементов с заданным ключом (открытая функция-член) |
|
| находит элемент с заданным ключом (открытая функция-член) |
|
|
(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) | Константный 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 << " does contain " << key << '\n';
else
std::cout << set << " doesn't contain " << key << '\n';
}
std::cout << '\n';
std::string_view word = "element";
std::set<char> characters(word.begin(), word.end());
std::cout << "There are " << characters.size() << " unique characters in "
<< std::quoted(word) << ":\n" << characters << '\n';
}
Вывод:
{ 1, 3, 5 }
{ 1, 2, 3, 5 }
{ 2, 3, 5 }
{ 2, 3, 5 } does contain 3
{ 2, 3, 5 } doesn't contain 4
There are 5 unique characters in "element":
{ e, l, m, n, t }
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применялся к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 103 | C++98 | iterator позволяет изменять ключи | iterator сделан константным |
| LWG 230 | C++98 |
Key не требовалось быть CopyConstructible(ключ типа Key мог оказаться невозможным для создания) |
Key также должен бытьCopyConstructible |
См. также
| коллекция ключей, отсортированных по ключам (шаблон класса) |
|
|
(C++11) | коллекция уникальных ключей, хешированных по ключам (шаблон класса) |
|
(C++23) | адаптирует контейнер для предоставления коллекции уникальных ключей, отсортированных по ключам (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/set