依据C++标准,std::multimap是否保留等价键的原始对象?
std::multimap插入等价键时会替换原始键对象吗?
先看你引用的标准描述:
C++标准“26.4.5.1 类模板multimap概述”第1段指出:multimap是一种关联容器,支持等价键(可能包含同一键值的多个副本),并提供基于键对另一类型T的值的快速检索(重点为笔者所加)。
这里的“支持等价键”很容易让人产生误解,但放心——std::multimap绝对不会用等价键替换你插入的原始键对象副本。
为啥这么说?我给你掰扯清楚:
- 首先,multimap的每个元素都是一个独立的
std::pair<const Key, T>对象。不管你插入的键和已有键是否等价,容器都会把你传入的键完整复制(或移动)一份,作为新元素的一部分存进去。 - 标准里说的“等价键”,只是指容器允许多个键在比较时被判定为等价(比如用默认的
std::less时,两个键a和b满足!less(a,b) && !less(b,a)),但这和“共享键存储”“替换原有键”完全是两码事。
给你举个实际的代码例子就懂了:
#include <iostream> #include <map> #include <string> struct CustomKey { std::string name; int unique_id; // 仅按name判断等价关系 bool operator<(const CustomKey& other) const { return name < other.name; } }; int main() { std::multimap<CustomKey, std::string> my_multimap; // 插入两个等价但不同的CustomKey对象 my_multimap.insert({{"Alice", 101}, "Engineer"}); my_multimap.insert({{"Alice", 102}, "Designer"}); // 遍历输出所有键的unique_id for (const auto& entry : my_multimap) { std::cout << "Key ID: " << entry.first.unique_id << ", Role: " << entry.second << "\n"; } return 0; }
运行这段代码,你会看到输出两个不同的unique_id:
Key ID: 101, Role: Engineer Key ID: 102, Role: Designer
这就证明了两个原始的CustomKey对象都被完整保留了,根本没有被替换。
哪怕是用int这种基础类型当键,插入多个相同值的键,multimap也会存储多个独立的元素——每个元素都有自己的键副本。标准里提到的“快速检索”,只是说你可以通过键值快速定位到所有等价的元素集合,而不是说容器会优化掉重复的键存储。
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

