std::sort 导致运算符分段错误<
std::sort causes segmentation fault in operator<
我正在尝试对 3D 整数向量 (IntVec
( 的列表 (std::vector
( 进行排序。不知何故,std::sort
在IntVec
的operator<
中导致分段错误。这是我的代码:
#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());
}
我可以为你提供数据集;但是,我想先看看我的代码中是否有一些重大的概念错误或一些我没有看到的错误。我发现问题特定于该数据集。如果我遗漏一个条目,则不会发生隔离错误。我认为这很奇怪,因为这样的错误应该更明显,并且与内存管理有关。另请注意,对x
、y
和z
使用整数不会造成任何问题。
这是代码的神螺栓版本。
这是一个相关的SO问题。但是,我认为我的代码没有导致此错误的相同缺陷。我认为我的排序关系是"严格<"。
运算符的逻辑已损坏(不满足严格的弱排序要求(。最后一句也需要lhs.z == rhs.z
。否则,lhs.z
可能会> rhs.z
,但您仍然可以获得积极的结果,从而导致排序不一致。
标准库算法将责任推卸给您,而打破由此产生的假设很容易导致混乱(阅读:未定义的行为(,例如分段错误。
想象一下,在实现中有一个注释,说"此时,我们知道a
小于b
,所以我们不需要对b
执行任何范围/边界检查"。当a
意外大于b
时,缺少边界检查可能会导致错误的内存访问。然而,结果可能要微妙得多,并导致奇怪的错误,所以正确处理很重要。
您可能希望考虑使用更短、更不容易出错的方法来实现此排序:
return std::tie(lhs.z, lhs.y, lhs.x) < std::tie(rhs.z, rhs.y, rhs.x);
在元组上使用operator<
(这是std::tie
给你的(自动(并且正确!(为你执行词典分解。
实际上,在cpp首选项页面上有一个很好的例子std::tie
,表明这是一件很常见的事情。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 为什么我使用 std::copy() 收到运行时错误(分段错误)?
- 为什么我的代码包含错误分段错误(核心转储)?
- 为什么会出现此错误?- 分段错误(核心转储)
- 意外的运行时错误(分段错误)
- C++将文本文件读入数组,运行错误:分段错误
- mmap 错误:分段错误/指针无效错误
- 在我的代码中找不到错误....分段错误
- 错误:分段故障(核心转储)阵列
- 用string.h将错误分段到队列中
- c++字符串流转换错误:分段错误
- 为什么我的代码显示错误分段错误(核心转储)