std排序有时会抛出seqmentation错误

std sort sometimes throws seqmention fault

本文关键字:seqmentation 错误 排序 std      更新时间:2024-09-22

我已经编写了以下函数,用于对数组的向量进行部分稳定排序。当向量的大小很小(如1G(时,它总是有效的,当向量的大(5或6 Gig(时,有时它有效,有时它会引发分割错误,有人能帮我解决这个问题吗。

template <typename T, size_t SIZE>
void sort(std::vector<std::array<T, SIZE>>& vec, size_t depth = SIZE) {
std::sort(vec.begin(), vec.end(),
[&](const auto& t1, const auto& t2)->bool {
for(size_t s = 0; s < depth; s++) {
if(t1[s] == t2[s]) {
continue;
}
return t1[s] < t2[s];
}
return true;
});
}

我使用g++10.2,这些是开关,我用-DNDEBUG -march=native -msse3 -ftree-vectorize -O3编译代码。

std::sort要求比较函数是一个"严格弱排序";,需要:

它是不可伸缩的:对于所有的xr(x, x)都是false;

您的比较函数不符合此要求,因为正如Mark Ransom在评论中指出的那样,您在返回t1 == t2时返回true。你的比较基本上是<=而不是<,你需要是<

最简单的修复方法是使用std::lexicographical_compare:

template <typename T, size_t SIZE>
void sort(std::vector<std::array<T, SIZE>>& vec, size_t depth = SIZE) {
std::sort(vec.begin(), vec.end(),
[depth](const auto& t1, const auto& t2)->bool {
return std::lexicographical_compare(t1.begin(), t1.begin() + depth,
t2.begin(), t2.begin() + depth);
});
}

为了完整起见,请注意,如果您不关心depth,您可以直接排序,因为std::array附带了一个内置的operator<,可以按字典进行比较。