Namespaces
Variants

std:: flat_set

From cppreference.net
定义于头文件 <flat_set>
template <

class Key,
class Compare = std:: less < Key > ,
class KeyContainer = std:: vector < Key >

> class flat_set ;
(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 对象。

std::flat_set 对象通常不能是 constexpr ,因为任何动态分配的存储都必须在同一常量表达式求值过程中释放。

(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)
销毁容器适配器的每个元素
(公开成员函数)
为容器适配器赋值
(公开成员函数)
迭代器
返回指向起始的迭代器
(公开成员函数)
返回指向末尾的迭代器
(公开成员函数)
返回指向起始的逆向迭代器
(公开成员函数)
返回指向末尾的逆向迭代器
(公开成员函数)
容量
检查容器适配器是否为空
(公开成员函数)
返回元素数量
(公开成员函数)
返回可能的最大元素数量
(公开成员函数)
修改器
原位构造元素
(公开成员函数)
使用提示原位构造元素
(公开成员函数)
插入元素
(公开成员函数)
插入元素范围
(公开成员函数)
提取底层容器
(公开成员函数)
替换底层容器
(公开成员函数)
擦除元素
(公开成员函数)
交换内容
(公开成员函数)
清空内容
(公开成员函数)
查找
查找具有特定键的元素
(公开成员函数)
返回匹配特定键的元素数量
(公开成员函数)
检查容器是否包含具有特定键的元素
(公开成员函数)
返回指向首个 不小于 给定键的元素的迭代器
(公开成员函数)
返回指向首个 大于 给定键的元素的迭代器
(公开成员函数)

非成员函数

按字典序比较两个 flat_set 的值
(函数模板)
特化 std::swap 算法
(函数模板)
擦除所有满足特定条件的元素
(函数模板)

辅助类

特化 std::uses_allocator 类型特征
(类模板特化)

标签

指示范围中的元素已排序且唯一
(标签)

推导指引

注释

成员类型 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

示例

参见

适配容器以提供按键排序的键集合
(类模板)
唯一键的集合,按键排序
(类模板)
唯一键的集合,按键哈希
(类模板)