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
的所有要求(包括对数搜索复杂度),但以下情况除外:
- 与节点相关的要求不适用,
- 迭代器失效要求有所不同,
- 插入和擦除操作的复杂度为线性。
平面集合支持大多数使用唯一键的 关联容器 操作。
std::flat_set
的所有成员函数都是
constexpr
:可以在常量表达式求值过程中创建和使用
std::flat_set
对象。
但
|
(since C++26) |
目录 |
迭代器失效
| 本节内容尚不完整 |
模板参数
| Key | - |
存储元素的类型。如果
Key
与
KeyContainer::value_type
不是同一类型,则程序非良构。
|
| Compare | - | 提供严格弱序的 Compare 类型。 |
| KeyContainer | - |
用于存储元素的基础
SequenceContainer
类型。该容器的迭代器应满足
LegacyRandomAccessIterator
要求或实现
random_access_iterator
概念。
标准容器 std::vector 和 std::deque 满足这些要求。 |
成员类型
| 类型 | 定义 |
container_type
|
Key
Container
|
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
(私有)
|
被适配的容器
( 仅用于说明的成员对象* ) |
key_compare
compare
(私有)
|
比较函数对象
( 仅用于说明的成员对象* ) |
成员函数
构造
flat_set
(公开成员函数) |
|
|
(destructor)
(implicitly declared)
|
销毁容器适配器的每个元素
(公开成员函数) |
|
为容器适配器赋值
(公开成员函数) |
|
迭代器 |
|
|
返回指向起始的迭代器
(公开成员函数) |
|
|
返回指向末尾的迭代器
(公开成员函数) |
|
|
返回指向起始的逆向迭代器
(公开成员函数) |
|
|
返回指向末尾的逆向迭代器
(公开成员函数) |
|
容量 |
|
|
检查容器适配器是否为空
(公开成员函数) |
|
|
返回元素数量
(公开成员函数) |
|
|
返回可能的最大元素数量
(公开成员函数) |
|
修改器 |
|
|
原位构造元素
(公开成员函数) |
|
|
使用提示原位构造元素
(公开成员函数) |
|
|
插入元素
(公开成员函数) |
|
|
插入元素范围
(公开成员函数) |
|
|
提取底层容器
(公开成员函数) |
|
|
替换底层容器
(公开成员函数) |
|
|
擦除元素
(公开成员函数) |
|
|
交换内容
(公开成员函数) |
|
|
清空内容
(公开成员函数) |
|
查找 |
|
|
查找具有特定键的元素
(公开成员函数) |
|
|
返回匹配特定键的元素数量
(公开成员函数) |
|
|
检查容器是否包含具有特定键的元素
(公开成员函数) |
|
|
返回指向首个
不小于
给定键的元素的迭代器
(公开成员函数) |
|
|
返回指向首个
大于
给定键的元素的迭代器
(公开成员函数) |
|
非成员函数
|
(C++23)
|
按字典序比较两个
flat_set
的值
(函数模板) |
|
(C++23)
|
特化
std::swap
算法
(函数模板) |
|
(C++23)
|
擦除所有满足特定条件的元素
(函数模板) |
辅助类
|
特化
std::uses_allocator
类型特征
(类模板特化) |
标签
|
(C++23)
|
指示范围中的元素已排序且唯一
(标签) |
推导指引
注释
成员类型
iterator
和
const_iterator
可能是同一类型的别名。这意味着使用这两种类型作为参数类型来定义一对函数重载可能违反
单一定义规则
。由于
iterator
可转换为
const_iterator
,改用单个以
const_iterator
作为参数类型的函数即可实现相同功能。
扁平集合相较于其他标准 容器适配器 的一些优势包括:
- 可能更快的查找速度(尽管搜索操作具有对数复杂度)。
- 更快的迭代:使用 随机访问迭代器 而非 双向迭代器 。
- 对小对象内存消耗更少(若支持 KeyContainer :: shrink_to_fit ( ) ,对大对象亦如此)。
-
更好的缓存性能(取决于
KeyContainer,键值存储在连续的内存块中)。
平面集合的一些缺点是:
- 非稳定迭代器(插入和删除元素时迭代器会失效)。
- 不可存储不可复制且不可移动的类型值。
- 较弱的异常安全性(在擦除和插入操作中移动值时,复制/移动构造函数可能抛出异常)。
- 较慢(即线性时间)的插入和擦除操作,特别是对于不可移动的类型。
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_flat_set
|
202207L
|
(C++23) |
std::flat_set
和
std::flat_multiset
|
__cpp_lib_constexpr_flat_set
|
202502L
|
(C++26) |
constexpr
std::flat_set
|
示例
|
本节内容不完整
原因:缺少示例 |
参见
|
(C++23)
|
适配容器以提供按键排序的键集合
(类模板) |
|
唯一键的集合,按键排序
(类模板) |
|
|
(C++11)
|
唯一键的集合,按键哈希
(类模板) |