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

map[key]与map.count(key)的区别及LeetCode代码问题排查

unordered_map中count()与[]操作的差异分析(LeetCode调试问题)

问题背景

在解决LeetCode题目《Longest Palindrome by Concatenating Two Letter Words》时,因判断条件误用map[rv]代替map.count(rv),导致花费超一小时调试。两者仅在此处存在差异,以下是可运行与不可运行代码、出错测试用例,以及核心差异解析。

可运行代码

class Solution {
public:
    int longestPalindrome(vector<string>& words) {
        unordered_map<string,int> map;
        for(string s:words){
            map[s]++;
        }
        bool isOdd = false;
        int ans = 0;
        for(auto i:map){
            string rv = i.first;
            reverse(rv.begin(),rv.end());
            if(i.first[0]==i.first[1]){
                if(i.second%2==0)
                    ans+=i.second;
                else{
                    ans+= i.second-1;
                    isOdd = true;
                }
            }
            else if(i.first[0]<i.first[1] && map.count(rv)){
                ans += 2*min(i.second,map[rv]);
            }
        }
        if(isOdd){
            ans++;
        }
        return 2*ans;      
    }
};

不可运行代码

class Solution {
public:
    int longestPalindrome(vector<string>& words) {
        unordered_map<string,int> map;
        for(string s:words){
            map[s]++;
        }
        bool isOdd = false;
        int ans = 0;
        for(auto i:map){
            string rv = i.first;
            reverse(rv.begin(),rv.end());
            if(i.first[0]==i.first[1]){
                if(i.second%2==0)
                    ans+=i.second;
                else{
                    ans+= i.second-1;
                    isOdd = true;
                }
            }
            else if(i.first[0]<i.first[1] && map[rv]){
                ans += 2*min(i.second,map[rv]);
            }
        }
        if(isOdd){
            ans++;
        }
        return 2*ans;      
    }
};

出错测试用例

["oo","vv","uu","gg","pp","ff","ss","yy","vv","cc","rr","ig","jj","uu","ig","gb","zz","xx","ff","bb","ii","dd","ii",
"ee","mm","qq","ig","ww","ss","tt","vv","oo","ww","ss","bi","ff","gg","bi","jj","ee","gb",
"qq","bg","nn","vv","oo","bb","pp","ww","qq","mm","ee","tt","hh","ss","tt","ee","gi","ig","uu","ff","zz",
"ii","ff","ss","gi","yy","gb","mm","pp","uu","kk","jj","ee"]

核心差异解析

1. map.count(rv)的行为

  • 仅用于检查键rv是否存在于map中,返回值为0或1(因为unordered_map的键具有唯一性)。
  • 不会修改map的结构,无论键是否存在,都不会插入新元素。

2. map[rv]的行为

  • 如果键rv存在,返回对应值的引用;如果不存在,会自动向map中插入一个键为rv、值为类型默认值(int类型默认是0)的新元素,再返回这个默认值的引用。
  • 本质是“查询+插入”的复合操作,会直接修改map的结构。

代码出错的原因

在遍历unordered_map的过程中使用map[rv],会导致以下问题:

  1. 插入额外元素:当rv不存在时,map[rv]会插入新元素,导致map的大小动态增加。
  2. 迭代器失效风险:unordered_map在插入元素时,若负载因子超过阈值会触发重新哈希,此时所有迭代器都会失效,继续遍历会引发未定义行为(如计算错误、程序崩溃)。
  3. 逻辑混乱:插入操作破坏了遍历的原始结构,后续元素处理逻辑被打乱,最终计算出错误的结果。

适用场景

  • map.count(key):仅需要判断键是否存在时使用,尤其适合在遍历容器的过程中做存在性检查,避免修改容器结构引发的问题。
  • map[key]:需要获取键对应的值,且允许键不存在时自动初始化默认值的场景,比如统计元素频次时,通过map[key]++自动初始化并累加计数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:20:32