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操作不会修改现有值,也不会执行插入,导致你看到的"未生效"现象。
解决方案
有三种常见的修复方式,按需选择:
使用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; }使用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; }直接使用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
相关产品推荐
相关产品推荐

