【发布时间】:2018-04-17 15:41:58
【问题描述】:
我知道我应该对 c++ 比较器遵循严格的弱排序。主要原因是!(a > b) && !(b > a) 应该充当等价运算符。
但问题只是在不需要等价运算符的地方进行排序,而不是像std::set。
例如,有集合的向量,如果集合A是B的真子集,那么经过排序,集合A的索引应该小于集合B的索引。
所以假设你这样写比较器
bool comparator(vector<int> &A, vector<int> &B) const {
// if A is proper subset of B, return true
// otherwise, return false
}
那么std::sort 与这个比较器是否总是像拓扑排序一样工作?
加号)
感谢 Oliver Charlesworth 提供的信息。
我真的很想知道,这种比较器可以与快速排序或插入排序(一些著名的基于比较的排序算法)之类的拓扑排序一起使用。
【问题讨论】:
-
您是在问 (A) 如果您提供
std::sort那个比较器会发生什么,或者 (B) 这个比较器是否可以用作拓扑排序的基础? (A) 的答案肯定是未定义的行为。 -
@OliverCharlesworth 我的意思是 (A)。它可能具有未定义的行为,因为 std::sort 可以通过多种方式实现。我想我错过了一些条件。我真正的问题是,如果排序算法类似于快速排序或堆排序或插入排序,那么结果就像拓扑排序一样正确。
-
没有。它在理论上和实践中都不起作用。 Qsort 不是拓扑排序。如果您需要拓扑排序算法,请使用一个。
-
您也可以查看this iso paper 以查看问题...
标签: c++ sorting strict-weak-ordering