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

C++ unordered_map自定义赋值异常求助:第二部分默认设为false

问题分析与修复方案

核心问题根源

你代码的问题出在对unordered_map的operator[]和insert方法特性的误解:

  • operator[]:访问不存在的键时,会自动插入默认初始化的键值对(int默认0,bool默认false),并返回对应值的引用。
  • insert:仅当键不存在时才插入新键值对;若键已存在,insert不会做任何修改,直接返回失败。

第一部分代码的逻辑冗余(看似正常实则无效操作)

你想统计数组元素的出现次数,但当前逻辑存在冗余:

unordered_map<int, int> hashmap;
for(int i=0; i<arr.size(); i++)
{
    if(hashmap.find(arr[i]) != hashmap.end())
        hashmap[arr[i]] += 1;
    hashmap.insert(make_pair(arr[i], 1)); // 键存在时此操作完全无效
}

当元素已存在时,operator[]已经完成了值的递增,后续的insert因为键已存在会直接失败,属于无效操作。

修正后的简洁写法:

unordered_map<int, int> hashmap;
for(int i=0; i<arr.size(); i++) {
    // operator[]会自动将不存在的键初始化为0,直接加1即可完成统计
    hashmap[arr[i]]++;
}

第二部分代码的关键错误(值变为false的原因)

这是你遇到的核心问题:

unordered_map<int, bool> hash2;
for(auto it=hashmap.begin(); it != hashmap.end(); ++it)
{
    if(hash2[it->second] == true) // 此处触发默认插入操作
        return false;
    hash2.insert(make_pair(it->second, true)); // 此时键已存在,insert失败
}

当hash2中没有it->second这个键时,hash2[it->second]会自动插入(it->second, false)的键值对,之后调用insert试图插入true时,因为键已存在,insert不会生效,最终该键对应的值还是false。

修正方案1:用find检查键是否存在(避免自动插入)

unordered_map<int, bool> hash2;
for(auto it=hashmap.begin(); it != hashmap.end(); ++it)
{
    // 用find检查,不会触发默认插入
    if(hash2.find(it->second) != hash2.end()) {
        return false;
    }
    hash2.insert(make_pair(it->second, true));
}
return true;

修正方案2:利用insert的返回值判断
insert会返回pair<迭代器, bool>,其中bool值表示是否成功插入新元素:

unordered_map<int, bool> hash2;
for(auto it=hashmap.begin(); it != hashmap.end(); ++it)
{
    auto insert_result = hash2.insert(make_pair(it->second, true));
    // 若insert失败(键已存在),直接返回false
    if(!insert_result.second) {
        return false;
    }
}
return true;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:53:29