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

C++中map.insert(make_pair())未按预期工作的问题求助

C++ std::map insert操作未按预期插入键值对

问题重现

第一段代码中,第23行的m.insert(std::make_pair(d, c))无法正常插入键值对,但第二段单独测试的insert代码却能正常工作:

第一段代码:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <set>
#include <map>
#include <algorithm>

int main() {
    std::map<std::string,int> m;
    int a,b,c;
    std::string d;
    std::cin >> a;
    for(int i=0;i<a;i++){
        std::cin >> b;
        std::cin >> d;
        std::cin >> c;
        if (b == 1) {
            std::cout << 1 << "\n";
            if (m[d] == 0){
                std::cout << "md==0\n";
                m.insert(std::make_pair(d, c)); // Line 23
                std::cout << d << " " << c << " " << m[d] << " Inserted\n";
            } else {
                std::cout << "Uvelich\n";
                m[d] += c;
            }
        }
    } 
    return 0;
}

第二段测试代码:

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main()
{
    map<string,int> m;
    m.insert(make_pair("t", 1));
    cout<<m["t"];
    return 0;
}

问题根源

问题出在第一段代码的if (m[d] == 0)这一行:

  • 当使用std::map的operator[]访问一个不存在的键时,map会自动插入该键,并将对应的值初始化为类型的默认值(int类型就是0)。
  • 所以当d不在map中时,执行m[d]已经自动插入了d:0的键值对,后续调用insert时,因为键d已经存在,insert操作不会修改现有值,也不会执行插入,导致你看到的"未生效"现象。

解决方案

有三种常见的修复方式,按需选择:

  1. 使用find方法检查键是否存在
    用find替代operator[]判断,避免自动插入默认值:

    if (m.find(d) == m.end()) {
        // 键不存在,执行插入
        m.insert(std::make_pair(d, c));
        std::cout << d << " " << c << " " << m[d] << " Inserted\n";
    } else {
        // 键存在,累加值
        std::cout << "Uvelich\n";
        m[d] += c;
    }
    
  2. 使用count方法检查键是否存在
    count会返回键的出现次数(map中键唯一,所以返回0或1):

    if (m.count(d) == 0) {
        m.insert(std::make_pair(d, c));
        std::cout << d << " " << c << " " << m[d] << " Inserted\n";
    } else {
        std::cout << "Uvelich\n";
        m[d] += c;
    }
    
  3. 直接使用operator[]简化代码
    因为operator[]在键不存在时会初始化为0,直接累加c即可覆盖插入和更新两种场景,代码更简洁:

    if (b == 1) {
        std::cout << 1 << "\n";
        m[d] += c;
        // 可选:输出日志
        std::cout << d << " " << c << " " << m[d] << (m[d] == c ? " Inserted\n" : " Updated\n");
    }
    

为什么第二段代码正常?

第二段代码中,先执行insert插入键"t",之后用operator[]访问时键已经存在,不会触发自动插入逻辑,所以能正常输出对应的值1。

内容的提问来源于stack exchange,提问作者Chainsaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:00:57