Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::sort segfault使用非传递比较器?_C++_Sorting_Gcc_Std_Gnu - Fatal编程技术网

C++ 为什么std::sort segfault使用非传递比较器?

C++ 为什么std::sort segfault使用非传递比较器?,c++,sorting,gcc,std,gnu,C++,Sorting,Gcc,Std,Gnu,然后可以生成一个分类容器,其中: (1, 3) (-1, 2), (3, 1) a

然后可以生成一个分类容器,其中:

 (1, 3) (-1, 2), (3, 1)
a
这个答案:解释了为什么当比较函数不考虑灵活性时,std::sort会处理越界问题(例如,快速排序,在这里我们进行comp(pivot,pivot)并得到true,因此左指针一直向右离开数组的末尾)

然而,我看到了不可伸缩但不可传递的比较的崩溃。我也相信我已经走到了终点

我不能在这里提供确切的代码,因为它是专有的。上面的例子在我的测试中不会崩溃,但我知道std::sort将根据要排序的容器和元素选择不同的算法


我想知道的是,如果有人知道为什么STD::当比较是非传递的时,排序会在GNU C++下崩溃?我知道非传递性比较打破了契约,它是一种未定义的行为,但我希望得到与链接问题中的答案类似的答案——即它为什么会崩溃。

如果
a
b
c
,你会把
c
放在哪里?“也就是说,它为什么会崩溃。”
std::sort
有许多可能的实现。只有共同点——它们必须遵循规范。所以你的问题是-什么是可能的(未来的)实现,可以崩溃在这个特定的违反。“你不觉得你要求的太匹配了吗?”@NathanOliver我相信这完全取决于初始输入的顺序和选择的排序算法。我已经做了一些便笺纸的方法,发现“无效”元素通常会自然地被吸引到数组的顶部或底部,或者它们可能会在中间。当然,这种排序没有“有效”的结果。C可以在任何地方,使其满足小于或大于相邻元素之一的条件。我在考虑一个半有效的bubblesort,它忽略第n遍的顶部元素,例如,它甚至可能不满足这个要求。@Slava我知道它有点长。我在谷歌上做了一些广泛的搜索,我发现一些人说,他们知道当你使用非传递比较器时,std::sort会崩溃,但我想我希望有人熟悉一个特定的用例,以前也会遇到过它,并能给我一个为什么会发生这种情况的想法。在导致此问题的实时代码中,问题是间歇性的,我没有能力重现。此外,二进制文件已经删除了调试符号,因此我很难遵循确切的代码路径。因此(至少对我来说)您似乎正在违反排序函数的约定,并想知道为什么会出现问题。正是这种契约允许排序函数在执行其工作时做出假设,这些假设可能会使排序更快。当然,尊重合同或找到一个不同的排序函数来处理您的案例会更有意义。我也很好奇,如果你有一个排序列表
a,b
,并且你想插入一个
c
,它既小于
a
,又大于
b
(也可能介于
a
b
之间),那么它要去哪里?
  (a < b) == true, (b < a) must be false.
   a == b, then (a < b) and (b < a) are false.
 (1, 3) (-1, 2), (3, 1)
  a < b, and b < c, but c < a.