Я пытаюсь отсортировать список (std::vector
) трехмерных целочисленных векторов (IntVec
). Каким-то образом std::sort
вызывает ошибку сегментации в operator<
из IntVec
. Вот мой код:
#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>
struct IntVec
{
public:
long x;
long y;
long z; // Using ints does not cause the Segmentation Fault ?!
friend bool operator<(const IntVec &lhs, const IntVec &rhs)
{
return (lhs.z < rhs.z) || // Segmentation Fault happens here
((lhs.z == rhs.z) && (lhs.y < rhs.y))
|| ((lhs.y == rhs.y) && (lhs.x < rhs.x));
}
};
int main(void)
{
std::vector<IntVec> vec;
const int N = 2178;
std::ifstream s("res.txt");
for (int i = 0; i < N; i++)
{
IntVec t;
s >> t.x;
s >> t.y;
s >> t.z;
vec.push_back(t);
}
// Using vec.begin() and vec.end() does not change anything
std::sort(vec.data(), vec.data() + vec.size());
}
Я могу предоставить вам набор данных; однако сначала я хотел посмотреть, есть ли у меня большая концептуальная ошибка в моем коде или какая-то ошибка, которую я не вижу. Я обнаружил, что проблема специфична для этого набора данных. Если я пропущу одну запись, Segfault не произойдет. Я думаю, что это довольно странно, так как такая ошибка должна быть более очевидной и связана с управлением памятью. Также обратите внимание, что использование целых чисел для x
, y
и z
не вызывает никаких проблем.
Вот версия кода Godbolt.
Вот связанный вопрос SO. Однако я думаю, что в моем коде нет того недостатка, который вызвал эту ошибку. Я думаю, что мое отношение порядка "строго ‹".
x
,y
иz
- лучшие имена, чемget<0>()
,get<1>()
,get<2>()
, если вы говорите о точках в трехмерном пространстве. 26.05.2020