【发布时间】:2018-03-22 02:19:11
【问题描述】:
以下代码在使用 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;
}
【问题讨论】:
-
您应该知道,如果您想要的只是词汇比较,那么
std::pair已经在您无需干预的情况下完成了这项工作。 -
@StoryTeller 感谢您的提示。但现在真正困扰我的是分段错误的根源!
-
来源在您的比较中没有引起适当的顺序关系。由于它,代码具有未定义的行为。
-
你的比较需要实现一个strict weak ordering - 你的没有这样做。