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

C++ sort函数异常:两段频率排序代码输出不同的原因解析

问题解析:第二段代码中sort函数未生效的原因

核心问题

你的第二段代码中,sort函数并非真的没生效,而是map中存储的频率值被意外修改,导致排序逻辑完全偏离预期。

具体原因分析

  1. 遍历map时的引用修改:
    在构建arr的循环中,你使用了auto &[numb,freq] : hm——这里的freq是对map中对应元素频率的引用。随后的freq--操作直接修改了map里存储的原始频率值。当循环结束后,map中所有元素的频率都被减到了0。

  2. 排序逻辑失效:
    后续sort的比较器中,hm[a]和hm[b]的结果全为0,因此会一直执行return a > b的分支。此时排序规则变成了单纯的元素值降序,而不是题目要求的「频率升序+同频值降序」。
    你的arr在构建时是按map的默认key升序(1→2→3)生成的[1,1,2,2,2,3],经过值降序排序后就得到了[3,2,2,2,1,1],也就是你看到的错误输出。

修复方案

只需避免修改map中的原始频率值,有两种简单方式:

方式一:遍历map时使用值拷贝(而非引用)

修改构建arr的循环,去掉&,让freq成为map中频率的拷贝,修改拷贝不会影响原map:

vector<int> arr;
// 去掉&,使用值拷贝
for(auto [numb,freq] :  hm){
    while(freq > 0){
        arr.push_back(numb);
        freq--;
    }
}

方式二:使用临时变量存储频率

如果坚持使用引用遍历,可以用临时变量存频率,修改临时变量而非原map的引用:

vector<int> arr;
for(auto &[numb,freq] :  hm){
    int cnt = freq; // 用临时变量保存频率
    while(cnt > 0){
        arr.push_back(numb);
        cnt--; // 修改临时变量,不影响原map
    }
}

修复后,map中的频率值保持完整,sort的比较器就能按照题目要求的逻辑工作,输出正确的[3,1,1,2,2,2]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:03:25