Namespaces
Variants

std:: flat_multimap

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

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

> class flat_multimap ;
(C++23 起)

flat_multimap 是一种 容器适配器 ,它提供包含键值对的关联容器功能,同时允许存在多个具有相同键值的条目。通过比较函数 Compare 对键进行排序。

类模板 flat_multimap 作为两个底层容器的包装器,这两个容器分别作为 KeyContainer MappedContainer 类型的对象传递。第一个容器已排序,且每个键对应的值位于第二个容器中相同索引(偏移量)的位置。两个容器中的元素数量始终保持一致。

在标准库所有使用 Compare 要求的地方,唯一性都是通过等价关系来确定的。非正式地说,两个对象 a b 被认为是等价的,当且仅当它们互不小于对方: ! comp ( a, b ) && ! comp ( b, a )


std::flat_multimap 满足 容器 可逆容器 可选容器要求 的所有需求,并满足 关联容器 的全部要求(包括对数搜索复杂度),但以下情况除外:

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

一个扁平多重映射支持大多数使用相等键的 关联容器 操作。

std::flat_multimap 的所有成员函数均为 constexpr :可以在常量表达式求值过程中创建和使用 std::flat_multimap 对象。

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

(since C++26)

目录

迭代器失效

模板参数

Key - 键的类型。若 Key KeyContainer::value_type 不是同一类型,则程序非良构。
T - 映射值的类型。若 T MappedContainer::value_type 不是同一类型,则程序非良构。
Compare - 提供严格弱序的 Compare 类型。
KeyContainer
MappedContainer
- 用于分别存储键和映射值的基础 SequenceContainer 类型。此类容器的迭代器应满足 LegacyRandomAccessIterator 或建模 random_access_iterator 。其成员函数 size max_size 的调用不应通过异常退出。

标准容器 std::vector std::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 实现定义的 LegacyInputIterator , ConstexprIterator (自 C++26 起) random_access_iterator value_type
const_iterator 实现定义的 LegacyInputIterator , ConstexprIterator (自 C++26 起) random_access_iterator const value_type
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_multimap
(公开成员函数)
(destructor)
(implicitly declared)
销毁容器适配器的每个元素
(公开成员函数)
为容器适配器赋值
(公开成员函数)
迭代器
返回指向起始的迭代器
(公开成员函数)
返回指向末尾的迭代器
(公开成员函数)
返回指向起始的逆向迭代器
(公开成员函数)
返回指向末尾的逆向迭代器
(公开成员函数)
容量
检查容器适配器是否为空
(公开成员函数)
返回元素数量
(公开成员函数)
返回可能的最大元素数量
(公开成员函数)
修改器
原位构造元素
(公开成员函数)
使用提示原位构造元素
(公开成员函数)
插入元素
(公开成员函数)
插入元素范围
(公开成员函数)
提取底层容器
(公开成员函数)
替换底层容器
(公开成员函数)
擦除元素
(公开成员函数)
交换内容
(公开成员函数)
清空内容
(公开成员函数)
查找
查找具有特定键的元素
(公开成员函数)
返回匹配特定键的元素数量
(公开成员函数)
检查容器是否包含具有特定键的元素
(公开成员函数)
返回指向首个 不小于 给定键的元素的迭代器
(公开成员函数)

非成员函数

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

辅助类

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

标签

指示某个范围内的元素已排序(不要求唯一性)
(标签)

推导指引

注释

成员类型 iterator const_iterator 可能是同一类型的别名。这意味着使用这两种类型作为参数类型来定义一对函数重载可能会违反 单一定义规则 。由于 iterator 可转换为 const_iterator ,改用单个以 const_iterator 作为参数类型的函数即可实现相同功能。

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

示例

参见

(C++23)
适配两个容器以提供按键排序的唯一键值对集合
(类模板)
按键排序的键值对集合
(类模板)
通过哈希函数组织键的键值对集合
(类模板)