std::flat_set

来自cppreference.com
< cpp‎ | container
 
 
 
 
在标头 <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) 的要求,都使用等价关系来确定唯一性。非正式而言,如果两个对象 ab 中没有任何一个比较小于另一个,则认为它们等价:!comp(a, b) && !comp(b, a)

std::flat_set 满足容器 (Container) 可逆容器 (ReversibleContainer) 的要求,可选容器要求,以及所有关联容器 (AssociativeContainer) 的要求(包括对数阶的搜索复杂度),但:

  • 不适用节点相关要求,
  • 迭代器失效的要求有所不同,
  • 插入和擦除操作的复杂度呈线性。

平铺集合支持关联容器 (AssociativeContainer) 的大多数使用唯一键的操作。

迭代器失效

模板形参

Key - 所存储元素的类型。如果 KeyKeyContainer::value_type 则程序非良构。
Compare - 一种提供严格弱序的比较 (Compare) 类型。
KeyContainer - 用以存储元素的底层序列容器 (SequenceContainer) 的类型。这种容器的迭代器应当满足老式随机访问迭代器 (LegacyRandomAccessIterator) 或实现 random_access_iterator

标准容器 std::vectorstd::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 由实现定义的指向 value_type老式随机访问迭代器 (LegacyRandomAccessIterator) random_access_iterator
const_iterator 由实现定义的指向 const value_type老式随机访问迭代器 (LegacyRandomAccessIterator) random_access_iterator
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>

成员对象

成员名称 定义
c (私有) container_type 类型的底层容器
(仅用于阐述的成员对象*)
compare (私有) key_compare 类型的比较函数对象
(仅用于阐述的成员对象*)

成员函数

构造 flat_set
(公开成员函数)
(析构函数)
(隐式声明)
销毁容器适配器的每个元素
(公开成员函数)
将值赋给容器适配器
(公开成员函数)
迭代器
返回指向起始的迭代器
(公开成员函数)
返回指向末尾的迭代器
(公开成员函数)
返回指向起始的逆向迭代器
(公开成员函数)
返回指向末尾的逆向迭代器
(公开成员函数)
容量
检查容器适配器是否为空
(公开成员函数)
返回元素数
(公开成员函数)
返回可容纳的最大元素数
(公开成员函数)
修改器
原位构造元素
(公开成员函数)
使用提示原位构造元素
(公开成员函数)
插入元素
(公开成员函数)
插入一个元素范围
(公开成员函数)
提取底层容器
(公开成员函数)
替换底层容器
(公开成员函数)
擦除元素
(公开成员函数)
交换内容
(公开成员函数)
清除内容
(公开成员函数)
查找
寻找带有特定键的元素
(公开成员函数)
返回匹配特定键的元素数量
(公开成员函数)
检查容器是否含有带特定键的元素
(公开成员函数)
返回指向首个不小于给定键的元素的迭代器
(公开成员函数)
返回指向首个大于给定键的元素的迭代器
(公开成员函数)
返回匹配特定键的元素范围
(公开成员函数)
观察器
返回用于比较键的函数
(公开成员函数)
返回用于比较 value_type 类型的对象中的键的函数
(公开成员函数)

非成员函数

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

辅助类

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

标签

指出范围的元素有序且唯一
(标签)

推导指引

注解

成员类型 iteratorconst_iterator 可能是同一类型的别名。这表明以这两个类型为形参类型的一对函数重载可能违背单一定义规则。因为 iterator 可转换到 const_iterator,所以可以改成只提供一个以 const_iterator 为形参类型的函数。

平铺集合相对于其他标准关联容器的优势有:

  • 可能更快的查找(即便搜索操作具有对数复杂度)。
  • 更快的遍历:随机访问迭代器而非双向迭代器
  • 对小对象消耗更少内存(而当 KeyContainer::shrink_to_fit() 可用时对大对象同样如此)。
  • 更好的缓存性能(取决于 KeyContainer,各键可存储于连续内存块之中)。

平铺集合的一些缺点有:

  • 不稳定的迭代器(迭代器会在插入和擦除元素时失效)。
  • 不能存储不可复制和不可移动类型的值。
  • 较弱的异常安全性(擦除和插入中进行位移时,复制/移动构造函数可能抛出异常)。
  • 更慢(成线性)的插入和擦除,尤其对于不可移动类型。
功能特性测试 标准 功能特性
__cpp_lib_flat_set 202207L (C++23) std::flat_setstd::flat_multiset

示例

参阅

调整容器以提供按关键字排序的关键字集合
(类模板)
唯一键的集合,按照键排序
(类模板)
(C++11 起)
唯一键的集合,按照键生成散列
(类模板)