gpt4 book ai didi

c++ - GCC 的 std::sort 与 lambda 的不稳定行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:46 25 4
gpt4 key购买 nike

以下代码在使用 GCC 6.1.0 编译时会生成段错误。奇怪的是,错误是一致的,但不会发生在较小的尺寸或略有不同的比较表达式上。你们知道为什么吗?

#include <vector>
#include <algorithm>
#include <iostream>
int main() {
int n = 1000;
std::vector<std::pair<double, double>> vec;
for(int i = 0; i < n; i++) {
vec.push_back(std::make_pair<double, double>((7*i)%3, (3*i)%5));
}
std::sort(vec.begin(), vec.end(), [](std::pair<double, double> const & p1, std::pair<double, double> const & p2) {return (p1.first < p2.first) || ((p1.first==p2.first)&& (p1.second <= p2.second));});
return 0;
}

最佳答案

尝试改变

(p1.second <= p2.second)

(p1.second < p2.second)

我的意思是... std::sort() 需要一个返回 true 的比较器 iff(当且仅当)第一个参数 (p1) 严格低于第二个 (p2)。即:当p1等于p2时,必须返回false

如果你的测试是

   (p1.first < p2.first)
|| ((p1.first==p2.first)&& (p1.second <= p2.second))

p1 等于 p2 时,您也获得 true

p1 等于 p2 时,使用返回 true 的比较器...如果我没记错,那么行为是未定义的“不稳定的行为”(以及段错误)是绝对可以理解的。

关于c++ - GCC 的 std::sort 与 lambda 的不稳定行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46670734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com