Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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++ 不保持元素顺序的稳定排序_C++ - Fatal编程技术网

C++ 不保持元素顺序的稳定排序

C++ 不保持元素顺序的稳定排序,c++,C++,我有一个对象的std::vector,对象可以是空的或NotEmpty(这是一个内部状态,对象本身总是有效的) 我想按内部状态对向量进行排序,同时保持排序前的相对顺序 理论上(除非我遗漏了什么),我只需要检查比较函数的第一个元素的内部状态: // i want to keep the NonEmptys first std::stable_sort(vec.begin(), vec.end(), [](const auto& first, const auto&

我有一个对象的std::vector,对象可以是空的或NotEmpty(这是一个内部状态,对象本身总是有效的)

我想按内部状态对向量进行排序,同时保持排序前的相对顺序

理论上(除非我遗漏了什么),我只需要检查比较函数的第一个元素的内部状态:

    // i want to keep the NonEmptys first
    std::stable_sort(vec.begin(), vec.end(), [](const auto& first, const auto& second)
    {
        return first.getStatus() != Status::Empty;
    });
问题是,这并没有保持排序前的顺序,事实上,如果我再次排序,它只会颠倒非空的顺序

我阅读了关于严格弱排序的内容,并尝试了几个比较函数,结果总是相同的(即使两个空函数都返回false,也尝试了)


提前感谢。

传递到
std::stable\u sort
的比较器没有形成有效的排序。例如,如果
object1
object2
都为空,则
object1
object2
(使用比较器)。这不能很好地与标准排序函数配合使用

你真正想要的是:


传递到
std::stable_sort
的比较器未形成有效的排序。例如,如果
object1
object2
都为空,则
object1
object2
(使用比较器)。这不能很好地与标准排序函数配合使用

你真正想要的是:

参数

comp-返回的比较函数对象(即满足比较要求的对象)​如果第一个参数小于第二个参数(即排序早于第二个参数),则为true

这意味着,如果
first
为非空且
second
为空,则为了首先对非空进行排序,比较函数必须返回true。反过来,它必须返回false。如果两者都是空的或两者都不是空的,则它还必须返回false,因为
first
不小于
second

因此,比较函数简化为

[](const auto &first, const auto &second) {
    return first.getStatus() != Status::Empty && second.getStatus() == Status.Empty;
}
现在,
std::stable\u sort
知道哪个元素较少,同样重要的是,哪些元素是等效的

参数

comp-返回的比较函数对象(即满足比较要求的对象)​如果第一个参数小于第二个参数(即排序早于第二个参数),则为true

这意味着,如果
first
为非空且
second
为空,则为了首先对非空进行排序,比较函数必须返回true。反过来,它必须返回false。如果两者都是空的或两者都不是空的,则它还必须返回false,因为
first
不小于
second

因此,比较函数简化为

[](const auto &first, const auto &second) {
    return first.getStatus() != Status::Empty && second.getStatus() == Status.Empty;
}

现在,
std::stable\u sort
知道哪个元素较少,并且同样重要,哪些元素是等效的。

在对数组排序时,必须比较这两个元素以确定哪一个应该先排序。@sap不清楚排序元素的顺序。在对数组排序时,您必须比较这两个元素以确定哪一个应该先排序。@sap不清楚已排序元素的顺序。请阅读partition()的文档。您完全正确,这正是我想要的,因为它不进行比较,它只使用true或false来决定先排序的元素。非常感谢,我会在stackoverflow允许的情况下尽快接受答案(6分钟内)。只要阅读分区()的文档就可以了。你完全正确,这正是我想要的,因为它不进行比较,它只使用true或false来决定先发生什么。非常感谢。只要stackoverflow允许,我会尽快接受答案(6分钟内)。不相等,相等。也就是说,彼此之间的关系不是有序的。@StoryTeller不确定,尽管根据你的说法可能是对的。另一方面,我不是以英语为母语的人,这只是标准对这些谓词使用的术语。例如,提到“等价键”。不等价,等价。也就是说,彼此之间的关系不是有序的。@StoryTeller不确定,尽管根据你的说法可能是对的。另一方面,我不是以英语为母语的人,这只是标准对这些谓词使用的术语。例如,提及“等效密钥”。