【问题标题】:could std::sort with not strict weak ordering comparator work as topological sorting?没有严格的弱排序比较器的 std::sort 可以用作拓扑排序吗?
【发布时间】: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


【解决方案1】:

不,它可能不起作用。 std::sort 合约需要严格的弱排序比较器;违反它会导致未定义的行为。顺便说一句,我已经多次看到 libstdc++ std::sort 为这种比较器“放松”而残酷地崩溃(读取容器外的元素,IIRC)。

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2013-02-14
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多