“26.4.5.1类模板多图概述”的C ++标准p1说:
重点是我的。那么它是否意味着multimap是一个关联容器,支持等效键(可能包含多个副本) 相同键值),并提供基于键快速检索另一种类型T的值。
std::multimap
在插入相同范围时可能无法保留原始密钥对象的副本并将其替换为相等的副本?
PS要明确这个问题的灵感来自这个Does Each Element of a multimap Contain Both the Key and Value?,我想知道multimap是否允许这样做,即我可以依赖它维护我的密钥的能力(可能相同但不相同)
答案 0 :(得分:4)
没有。该标准描述了如何在this table中插入元素。例如,a_eq.emplace(args)
的效果描述如下(强调我的)。
效果: 插入使用
value_type
构造的t
对象std::forward<Args>(args)...
,并返回指向新插入元素的迭代器。如果t
中包含等同于a_eq
的元素的范围,则会在该范围的末尾插入t
。
请注意value_type
的{{1}}为std::multimap<Key, T>
,因此必须构建相同(不仅仅相同)的密钥。
答案 1 :(得分:3)
不,这并不意味着。 multimap
必须为每个元素都有一个与对象关联的键。这是规范性的措辞:
26.4.5.1:multimap是一个关联容器,支持等效键(可能包含同一个键的多个副本) 值)...
26.2.6:短语“等价键”是指比较对象施加的等价关系。也就是说,两个键k1和k2 如果对于比较对象comp,则被认为是等效的 comp(k1,k2)== false&amp;&amp; comp(k2,k1)== false。 [注意:事实并非如此 必然与k1 == k2的结果相同。 - 结束说明]任何 两个密钥k1和k2在同一个容器中,调用comp(k1,k2) 总是返回相同的值。
由于find
和朋友需要使用各自的键返回元素(同时保留等效元素的相对排序!),因此符合条件的multimap无法存储单个键。