std::set
— это ассоциативный контейнер, содержащий отсортированное множество уникальных объектов типа
Key
. Сортировка выполняется с использованием функции сравнения ключей
Compare
. Операции поиска, удаления и вставки имеют логарифмическую сложность. Множества обычно реализуются как
красно-чёрные деревья
.
Везде, где стандартная библиотека использует требования
Compare
, уникальность определяется с использованием отношения эквивалентности. В упрощённой формулировке, два объекта
a
и
b
считаются эквивалентными, если ни один из них не меньше другого:
!
comp
(
a, b
)
&&
!
comp
(
b, a
)
.
Все функции-члены
std::set
являются
constexpr
: возможно создавать и использовать объекты
std::set
при вычислении константного выражения.
Однако, объекты
std::set
обычно не могут быть
constexpr
, поскольку любая динамически выделенная память должна быть освобождена в том же вычислении константного выражения.
Типы-члены
iterator
и
const_iterator
могут быть псевдонимами одного и того же типа. Это означает, что определение пары перегруженных функций, использующих эти два типа в качестве типов параметров, может нарушать
Правило Одного Определения
. Поскольку
iterator
конвертируется в
const_iterator
, вместо этого будет работать единственная функция с параметром типа
const_iterator
.
#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';elsestd::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++.