std排序有时会抛出seqmentation错误
std sort sometimes throws seqmention fault
我已经编写了以下函数,用于对数组的向量进行部分稳定排序。当向量的大小很小(如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
要求比较函数是一个"严格弱排序";,需要:
它是不可伸缩的:对于所有的
x
,r(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<
,可以按字典进行比较。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'