"std::multimap"是否保证每个键的实际值在相等范围内?

Does `std::multimap` guarantee actual value of each key in equal range?

本文关键字:quot 范围内 是否 multimap std      更新时间:2023-10-16

C++"26.4.5.1 类模板多映射概述"p1 的标准 说:

多重映射是支持等效键(可能包含多个副本)的关联容器 相同的键),并提供基于键的另一种类型 T 的值的快速检索。

重点是我的。那么这是否意味着std::multimap在插入相等范围时可能不会保留原始键对象的副本并将其替换为相等的 1?

PS 为了明确这个问题的灵感,这个问题的灵感来自这个 多重映射的每个元素是否同时包含键和值? 我想知道多映射是否允许这样做,即我可以依靠它来维护我的密钥的能力(可以相等但不相同)。

No.该标准描述了如何在此表中插入元素。例如,a_­eq.​emplace(​args)的效果描述如下(强调我的)。

效果: 插入tstd​::​forward<​Args​>(​args)...构造的value_­type对象,并返回指向新插入元素的迭代器。如果a_­eq中存在包含t等效元素的区域,则t将插入到该范围的末尾。

注意std::multimap<Key, T>value_­typestd::pair<const Key, T>的,所以必须构造一个相同的(不仅是等效的)键。

不,不是这个意思。multimap必须为每个元素都有一个与对象关联的键。以下是规范性措辞:

26.4.5.1:多重映射是支持等效键(可能包含同一键的多个副本)的关联容器 值)...

26.2.6:"键的等价性"一词是指比较对象强加的等价关系。也就是说,两个键 k1 和 k2 如果对于比较对象 comp, 则被视为等效, comp(k1, k2) == false && comp(k2, k1) == false.[ 注意:这不是 必然与 k1 == k2 的结果相同。— 尾注 ] 对于任何 两个键 K1 和 K2 在同一个容器中,调用 comp(K1, K2) 应 始终返回相同的值。

由于find和朋友需要返回带有各自键的元素(也保留等效元素的相对顺序!),因此一致的多映射无法存储单个键。