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

使用lambda作为排序谓词排序pair类型vector时触发内存损坏崩溃

问题原因

std::sort要求传入的比较函数满足严格弱序规则,且签名匹配要求,你的代码崩溃是两个编译器相关的问题共同导致的:

  • 你定义的lambda使用了不必要的全引用捕获[&],但实际没有用到任何外部变量,部分编译器对这种无意义捕获的处理存在缺陷,会导致排序过程中出现内存越界,触发堆破坏。
  • lambda使用C++14的泛型auto参数,部分旧版本编译器对泛型lambda的类型推导存在bug,导致比较函数的参数类型不符合std::sort的预期,进一步引发内存访问异常。

另外你写的lambda逻辑和std::pair的默认比较逻辑完全一致:都是先比较first值,相等再比较second值,所以完全可以不用自定义lambda。

修复方案

两种方案任选其一即可:

方案1:修正lambda写法

去掉不必要的捕获,明确参数类型,避免编译器推导异常:

sort(temp.begin(), temp.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
    return a.first != b.first ? a.first < b.first : a.second < b.second;
});

方案2:直接使用默认排序

因为你的自定义逻辑和pair的默认排序逻辑完全一致,直接去掉lambda即可,代码更简洁也不会出现崩溃问题:

sort(temp.begin(), temp.end());

补充说明:编译时建议指定C++11及以上标准,比如使用gcc编译时添加参数-std=c++17,避免因标准不匹配出现未知问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 00:33:03