C++ 不保持元素顺序的稳定排序
我有一个对象的std::vector,对象可以是空的或NotEmpty(这是一个内部状态,对象本身总是有效的) 我想按内部状态对向量进行排序,同时保持排序前的相对顺序 理论上(除非我遗漏了什么),我只需要检查比较函数的第一个元素的内部状态: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&
// 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不确定,尽管根据你的说法可能是对的。另一方面,我不是以英语为母语的人,这只是标准对这些谓词使用的术语。例如,提及“等效密钥”。