std::flat_set
| 在头文件 <flat_set> 中定义 |
||
| template< class Key, |
(C++23 起) | |
flat set 是一个容器适配器,它提供关联容器的功能,存储类型为Key的唯一对象的有序集合。排序使用键比较函数Compare完成。
类模板flat_set充当传递类型为KeyContainer的底层有序容器的包装器。
标准库中使用Compare要求的地方,唯一性由使用等价关系决定。非正式地,如果两个对象a和b都不会比另一个小,则认为它们是等价的:!comp(a, b) && !comp(b, a)。
std::flat_set满足Container、ReversibleContainer、可选容器要求的所有要求,以及AssociativeContainer的所有要求(包括对数搜索复杂度),除了
- 与节点相关的要求不适用,
- 迭代器失效要求不同,
- 插入和擦除操作的复杂度是线性的。
flat set 支持大多数使用唯一键的关联容器操作。
|
|
(C++26 起) |
目录 |
[编辑] 迭代器失效
| 本节不完整 |
[编辑] 模板参数
| Key | - | 存储元素的类型。如果Key与KeyContainer::value_type类型不同,则程序格式错误。 |
| Compare | - | 提供严格弱排序的 Compare 类型。 |
| KeyContainer | - | 用于存储元素的底层序列容器的类型。此类容器的迭代器应满足旧式随机访问迭代器或模型random_access_iterator。标准容器std::vector和std::deque满足这些要求。 |
[编辑] 成员类型
| 类型 | 定义 |
container_type
|
KeyContainer |
key_type
|
Key |
value_type
|
Key |
key_compare
|
Compare |
value_compare
|
Compare |
reference
|
value_type& |
const_reference
|
const value_type& |
size_type
|
typename KeyContainer::size_type |
difference_type
|
typename KeyContainer::difference_type |
iterator
|
实现定义的LegacyRandomAccessIterator,ConstexprIterator(自 C++26 起)和random_access_iterator到value_type |
const_iterator
|
实现定义的LegacyRandomAccessIterator,ConstexprIterator(自 C++26 起)和random_access_iterator到const value_type |
reverse_iterator
|
std::reverse_iterator<iterator> |
const_reverse_iterator
|
std::reverse_iterator<const_iterator> |
[编辑] 成员对象
| 成员 | 描述 |
container_type c (private) |
被适配的容器 (仅用于阐释的成员对象*) |
key_compare compare (private) |
比较函数对象 (仅用于阐释的成员对象*) |
[编辑] 成员函数
构造flat_set(公共成员函数) | |
| (析构函数) (隐式声明) |
销毁容器适配器的每个元素 (公开成员函数) |
| 向容器适配器赋值 (公共成员函数) | |
迭代器 | |
| 返回指向起始的迭代器 (公共成员函数) | |
| 返回指向末尾的迭代器 (公共成员函数) | |
| 返回指向起始的逆向迭代器 (公共成员函数) | |
| 返回指向末尾的逆向迭代器 (公共成员函数) | |
容量 | |
| 检查容器适配器是否为空 (公共成员函数) | |
| 返回元素数量 (公共成员函数) | |
| 返回元素的最大可能数量 (公共成员函数) | |
修改器 | |
| 就地构造元素 (公共成员函数) | |
| 使用提示就地构造元素 (公共成员函数) | |
| 插入元素 (公共成员函数) | |
| 插入元素范围 (公共成员函数) | |
| 提取底层容器 (公共成员函数) | |
| 替换底层容器 (公共成员函数) | |
| 擦除元素 (公共成员函数) | |
| 交换内容 (公共成员函数) | |
| 清除内容 (公共成员函数) | |
查找 | |
| 查找具有特定键的元素 (公共成员函数) | |
| 返回匹配特定键的元素数量 (公共成员函数) | |
| 检查容器是否包含具有特定键的元素 (公共成员函数) | |
| 返回指向第一个不小于给定键的元素的迭代器 (公共成员函数) | |
| 返回指向第一个大于给定键的元素的迭代器 (公共成员函数) | |
| 返回与特定键匹配的元素范围 (公共成员函数) | |
观察器 | |
| 返回比较键的函数 (公共成员函数) | |
返回比较 value_type 类型对象中的键的函数(公共成员函数) | |
[编辑] 非成员函数
| (C++23) |
按字典序比较两个flat_set的值(函数模板) |
| (C++23) |
特化 std::swap 算法 (函数模板) |
| (C++23) |
擦除所有满足特定标准的元素 (函数模板) |
[编辑] 辅助类
| 特化 std::uses_allocator 类型特性 (类模板特化) |
[编辑] 标签
| (C++23) |
表示范围的元素已排序且唯一 (标签) |
[编辑] 推导指南
[编辑] 注记
成员类型iterator和const_iterator可能是相同类型的别名。这意味着使用这两种类型作为参数类型定义一对函数重载可能违反单定义规则。由于iterator可转换为const_iterator,因此使用const_iterator作为参数类型的单个函数将起作用。
flat set 相对于其他标准容器适配器的一些优点是
- 潜在更快的查找(尽管搜索操作具有对数复杂度)。
- 更快的迭代:随机访问迭代器而不是双向迭代器。
- 小对象内存消耗更少(如果KeyContainer::shrink_to_fit()可用,大对象也是如此)。
- 更好的缓存性能(取决于
KeyContainer,键存储在连续的内存块中)。
flat set 的一些缺点是
- 迭代器不稳定(插入和擦除元素时迭代器失效)。
- 不能存储不可复制和不可移动的类型值。
- 较弱的异常安全性(在擦除和插入中移动值时,复制/移动构造函数可能会抛出异常)。
- 较慢的(即线性)插入和擦除,尤其是对于不可移动的类型。
| 特性测试宏 | 值 | 标准 | 特性 |
|---|---|---|---|
__cpp_lib_flat_set |
202207L |
(C++23) | std::flat_set 和 std::flat_multiset |
__cpp_lib_constexpr_containers |
202502L |
(C++26) | constexpr std::flat_set |
[编辑] 示例
| 本节不完整 原因:无示例 |
[编辑] 另请参阅
| (C++23) |
适配容器以提供按键排序的键集合 (类模板) |
| 唯一键的集合,按键排序 (类模板) | |
| (C++11) |
由键哈希的唯一键集合 (类模板) |