在排序时更改排序顺序是否是未定义的行为
Is it undefined behaviour to change sort order while sorting?
想象一下以下场景:
std::atomic<int> values[10];
std::size_t indices[10];
void sort() {
std::iota(indices, indices+10, 0);
std::sort(indices, indices+10,
[&](size_t lhs, size_t rhs) { return values[lhs] < values[rhs]; });
}
在运行sort()
时,另一个线程正在更改values
。这是否只会导致索引之后没有正确排序,或者实际上是未定义的行为?
可能(见下文)这是未定义的行为; 在实践中,我见过普通的崩溃(对于容器外边界访问),即使只是对于不正确的(=不诱导总排序)比较器,并且在排序时更改索引的<
肯定无法诱导总排序
有趣的是,该标准没有明确提到有关此问题的未定义行为;C++11 §5.4 ¶3 只是声明
要使 25.4.3 中描述的算法以外的算法正常工作,
comp
必须对值进行严格的弱排序。
而且我看不到"正常工作"的正式定义;甚至在整个第25章(描述<algorithm>
)中也没有提到"未定义"这个词。
std::sort 需要一个满足严格弱排序规则的排序器。(在此回答中解释)
如果同时更改内容,则此排序可能无法保持,从而导致未定义的行为。(可能导致排序器中的无限循环,崩溃,之后索引未正确排序(如您所提到的),索引正确排序,2个月亮或其他东西)
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- c++11评估顺序(未定义的行为)
- 使用mysql c++连接器的未定义引用
- 从python调用openMP共享库时,未定义opnMP函数
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 具有外部"c"和程序集的未定义函数
- 此增量后语句是否会导致未定义的行为?
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在C++中使用内联方法时出现未定义的符号错误
- 在排序时更改排序顺序是否是未定义的行为