std::set
在标头 <set> 定义 | ||
template< class Key, | (1) | |
namespace pmr { template< | (2) | (C++17 起) |
std::set
是一种关联容器,含有 Key
类型对象的已排序集。用比较函数 比较(Compare) 进行排序。搜索、移除和插入拥有对数复杂度。set
通常以红黑树实现。
标准库使用比较(Compare) 的规定时,均用等价关系确定唯一性。不精确地说,如果两个对象 a 与 b 相互比较不小于对方:!comp(a, b)&&!comp(b, a),那么认为它们等价。
std::set
满足容器(Container) 、知分配器容器(AllocatorAwareContainer) 、关联容器(AssociativeContainer) 和可逆容器(ReversibleContainer) 的要求。
然而, | (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 | 指向 value_type 的常老式双向迭代器(LegacyBidirectionalIterator) 和常量表达式迭代器(ConstexprIterator) (C++26 起) | ||||
const_iterator | 指向 const value_type 的老式双向迭代器(LegacyBidirectionalIterator) 和常量表达式迭代器(ConstexprIterator) (C++26 起) | ||||
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> |
[编辑]成员函数
构造 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) | constexprstd::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';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++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 103 | C++98 | 允许通过迭代器修改键 | 使迭代器为常迭代器 |
LWG 230 | C++98 | Key 不需要满足可复制构造(CopyConstructible) (因此不保证能构造 Key 类型的键) | Key 也需要满足可复制构造(CopyConstructible) |
[编辑]参阅
键的集合,按照键排序 (类模板) | |
(C++11 起) | 唯一键的集合,按照键生成散列 (类模板) |
(C++23) | 调整容器以提供按键排序的唯一键集合 (类模板) |