C++ sort函数异常:两段频率排序代码输出不同的原因解析
问题解析:第二段代码中sort函数未生效的原因
核心问题
你的第二段代码中,sort函数并非真的没生效,而是map中存储的频率值被意外修改,导致排序逻辑完全偏离预期。
具体原因分析
遍历map时的引用修改:
在构建arr的循环中,你使用了auto &[numb,freq] : hm——这里的freq是对map中对应元素频率的引用。随后的freq--操作直接修改了map里存储的原始频率值。当循环结束后,map中所有元素的频率都被减到了0。排序逻辑失效:
后续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
相关产品推荐
相关产品推荐

