You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

依据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:32:49