如何使vector<pair<long long,long long>>排序时,second相同则按first升序?
解决Pair元素排序的稳定需求
这个问题很常见——你当前的排序逻辑只处理了second不同的情况,当两个元素的second相等时,比较函数返回false,这时候sort无法确定它们的相对顺序,所以结果就不可控了。要实现你想要的**second降序优先,second相等时按first升序**的逻辑,只需要给比较函数补充相等场景的判断即可:
方案1:修改原比较函数
直接在你定义的third_parameter函数里,增加second相等时的first比较逻辑:
bool third_parameter(const pair<long long, long long>& a, const pair<long long, long long>& b) { // 优先按second降序排序 if (a.second != b.second) { return a.second > b.second; } // 当second相等时,按first升序排序 return a.first < b.first; } int main (){ sort(vec.begin(), vec.end(), third_parameter ); return 0; }
方案2:使用Lambda表达式(更简洁)
如果这个比较逻辑只在排序时使用,直接用lambda表达式可以省去单独定义函数的麻烦,代码更紧凑:
int main (){ sort(vec.begin(), vec.end(), [](const pair<long long, long long>& a, const pair<long long, long long>& b) { if (a.second != b.second) { return a.second > b.second; } return a.first < b.first; }); return 0; }
为什么这样能解决问题?
sort函数依赖严格弱序的比较规则,我们修改后的逻辑确保了每一对元素都有明确的排序依据:要么按second从大到小,要么在second相同时按first从小到大,这样排序后的结果就完全符合你的预期了。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

