std::flat_map

来自cppreference.com
< cpp‎ | container
 
 
 
 
在标头 <flat_map> 定义
template<

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

> class flat_map;
(C++23 起)

平铺映射(flat map)是一种容器适配器,给出具有唯一键的包含键-值对的关联容器的功能。用比较函数 Compare 来对键进行排序。

类模板 flat_map 表现为对分别作为 KeyContainerMappedContainer 类型的对象而传递的底层容器的包装器。第一个容器有序,且每个键的对应值在第二个容器中处于相同索引(偏移量)。两个容器的元素数量相同。

每当标准库使用比较 (Compare) 的要求,都使用等价关系来确定唯一性。非正式而言,如果两个对象 ab 中没有任何一个比较小于另一个,则认为它们等价:!comp(a, b) && !comp(b, a)

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

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

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

std::flat_map 的全部成员函数均为 constexpr:在常量表达式求值中创建并使用 std::flat_map 对象是可能的。

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

(C++26 起)

目录

[编辑] 迭代器失效

[编辑] 模板形参

Key - 键的类型。如果 KeyKeyContainer::value_type 不是同一类型则程序非良构。
T - 被映射值的类型。如果 TMappedContainer::value_type 不是同一类型则程序非良构。
Compare - 一种提供严格弱序的比较 (Compare) 类型。
KeyContainer
MappedContainer
- 用以分别存储键和被映射值的底层序列容器 (SequenceContainer) 的类型。这种容器的迭代器应当满足老式随机访问迭代器 (LegacyRandomAccessIterator) 或实现 random_access_iterator。其成员函数 sizemax_size 的调用不能以异常退出。

标准容器 std::vectorstd::deque 均满足这些要求。

[编辑] 成员类型

类型 定义
key_container_type KeyContainer[编辑]
mapped_container_type MappedContainer[编辑]
key_type Key[编辑]
mapped_type T[编辑]
value_type std::pair<key_type, mapped_type>[编辑]
key_compare Compare [编辑]
reference std::pair<const key_type&, mapped_type&>[编辑]
const_reference std::pair<const key_type&, const mapped_type&>[编辑]
size_type std::size_t[编辑]
difference_type std::ptrdiff_t[编辑]
iterator 由实现定义的指向 value_type老式输入迭代器 (LegacyInputIterator) 常量表达式迭代器 (ConstexprIterator) (C++26 起)random_access_iterator[编辑]
const_iterator 由实现定义的指向 const value_type老式输入迭代器 (LegacyInputIterator) 常量表达式迭代器 (ConstexprIterator) (C++26 起)random_access_iterator[编辑]
reverse_iterator std::reverse_iterator<iterator>[编辑]
const_reverse_iterator std::reverse_iterator<const_iterator>[编辑]
containers 描述底层容器的类型

struct containers
{
    key_container_type keys;
    mapped_container_type values;
};
[编辑]

[编辑] 成员类

比较 value_type 类型的对象
(类) [编辑]

[编辑] 成员对象

成员 说明
containers c (私有) 适配的容器
(仅用于阐述的成员对象*)
key_compare compare (私有) 比较函数对象
(仅用于阐述的成员对象*)

[编辑] 成员函数

构造 flat_map
(公开成员函数) [编辑]
(析构函数)
(隐式声明)
销毁容器适配器的每个元素
(公开成员函数)
将值赋给容器适配器
(公开成员函数) [编辑]
元素访问
带越界检查访问指定的元素
(公开成员函数) [编辑]
访问或插入指定的元素
(公开成员函数) [编辑]
迭代器
返回指向起始的迭代器
(公开成员函数) [编辑]
返回指向末尾的迭代器
(公开成员函数) [编辑]
返回指向起始的逆向迭代器
(公开成员函数) [编辑]
返回指向末尾的逆向迭代器
(公开成员函数) [编辑]
容量
检查容器适配器是否为空
(公开成员函数) [编辑]
返回元素数
(公开成员函数) [编辑]
返回可容纳的最大元素数
(公开成员函数) [编辑]
修改器
原位构造元素
(公开成员函数) [编辑]
使用提示原位构造元素
(公开成员函数) [编辑]
若键不存在则原位插入,若键存在则不做任何事
(公开成员函数) [编辑]
插入元素
(公开成员函数) [编辑]
插入元素范围
(公开成员函数) [编辑]
插入元素,或若键已存在则赋值给当前元素
(公开成员函数) [编辑]
提取底层容器
(公开成员函数) [编辑]
替换底层各容器
(公开成员函数) [编辑]
擦除元素
(公开成员函数) [编辑]
交换内容
(公开成员函数) [编辑]
清除内容
(公开成员函数) [编辑]
查找
寻找带有特定键的元素
(公开成员函数) [编辑]
返回匹配特定键的元素数量
(公开成员函数) [编辑]
检查容器是否含有带特定键的元素
(公开成员函数) [编辑]
返回指向首个不小于 给定键的元素的迭代器
(公开成员函数) [编辑]
返回指向首个大于 给定键的元素的迭代器
(公开成员函数) [编辑]
返回匹配特定键的元素范围
(公开成员函数) [编辑]
观察器
返回用于比较键的函数
(公开成员函数) [编辑]
返回用于比较 value_type 类型的对象中的键的函数
(公开成员函数) [编辑]
直接访问底层键容器
(公开成员函数) [编辑]
直接访问底层值容器
(公开成员函数) [编辑]

[编辑] 非成员函数

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

[编辑] 辅助类

特化 std::uses_allocator 类型特征
(类模板特化) [编辑]

[编辑] 标签

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

[编辑] 推导指引

[编辑] 注解

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


功能特性测试 标准 功能特性
__cpp_lib_flat_map 202207L (C++23) std::flat_mapstd::flat_multimap
__cpp_lib_constexpr_containers 202502L (C++26) constexpr std::flat_map

[编辑] 示例

[编辑] 参阅

适配两个容器以提供按键排序的键值对集合
(类模板) [编辑]
键值对的集合,按照键排序,键是唯一的
(类模板) [编辑]
(C++11 起)
键值对的集合,按照键生成散列,键是唯一的
(类模板) [编辑]