Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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进行拓扑排序_C++_Sorting_C++11_Topological Sort - Fatal编程技术网

C++ 使用std::sort进行拓扑排序

C++ 使用std::sort进行拓扑排序,c++,sorting,c++11,topological-sort,C++,Sorting,C++11,Topological Sort,注意:在写这个问题时,我想我已经找到了答案。请随意添加或附加一个更好的版本。我想记录下我的问题可能会很好编辑我错了,我的回答不正确 考虑整数对的列表:我想基于偏序对它们进行拓扑排序。这与类似,但我希望使用std::sort而不是std::priority\u队列 为此,我编写了以下代码: #include <iostream> #include <vector> #include <algorithm> struct pair { int a, b

注意:在写这个问题时,我想我已经找到了答案。请随意添加或附加一个更好的版本。我想记录下我的问题可能会很好编辑我错了,我的回答不正确

考虑整数对的列表:我想基于偏序对它们进行拓扑排序。这与类似,但我希望使用std::sort而不是std::priority\u队列

为此,我编写了以下代码:

#include <iostream>
#include <vector>
#include <algorithm>


struct pair {
    int a, b;
    pair(int a, int b) : a(a), b(b) {}

    std::ostream &print(std::ostream &out) const {
        return (out << "(" << a << ", " << b << ")");
    }
};

std::ostream &operator<<(std::ostream &out, const pair &p) { return p.print(out); }

struct topological_pair_comparator {
    bool operator()(const pair &p, const pair &q) const { return p.a<q.a && p.b<q.b; }
} tpc;

std::vector<pair> pairs = {
    pair(1,1),
    pair(1,2),
    pair(2,1),
    pair(3,1),
    pair(1,3),
    pair(5,5),
    pair(2,2),
    pair(4,0)
};

int main() {
    std::sort(pairs.begin(), pairs.end(), tpc);
    for(const pair &p : pairs) std::cout << p << " ";
    std::cout << std::endl;
    return 0;
}
这几乎是拓扑排序(通过示例证明;)

然而,偏序造成了这种情况!((1,2)<(2,1))和!((1,2)>(2,1))根据tpc,因此可以得出(1,2)==(2,1)的结论。但是,C++标准(2012年1月工作草案)第25.4.3段规定:

对于所有采用Compare的算法,有一个版本使用运算符<。即comp(*i, *j) !=false默认为*i<*j!=错。对于25.4.3中所述以外的算法 正确地说,comp必须对值进行严格的弱排序

编辑:根据ecatmur的有效答案: 偏序不一定是严格弱序;它打破了不相容的及物性。因此,我想放弃偏序永远是严格弱序的推理,并添加一个问题:我注定要编写自己的拓扑排序算法还是使用boost实现来构建图

解决方案:ecatmur的明智建议:

结构拓扑对比较器{ bool操作符()(const pair&p,const pair&q)const{return(p.a+p.b)<(q.a+q.b);} }tpc; 资料来源:

请注意,SO-about堆并没有明确提到std::sort在拓扑上排序;除了一条没有论证支持的评论之外。

考虑这些值

pair
    x{0, 1},
    y{2, 0},
    z{1, 2};
这里,

但是,

tpc(x, z);
因此,您的比较器不会强制执行严格的弱排序,如果您将其与
std::sort
一起使用,或者在需要严格弱排序的任何其他角色中使用,则行为是未定义的

严格弱的比较器是对比较器的改进:

struct refined_comparator {
    bool operator()(const pair &p, const pair &q) const { return p.a + p.b < q.a + q.b; }
} rc;
struct-defined\u比较器{
bool操作符()(const pair&p,const pair&q)const{return p.a+p.b
根据维基百科,偏序也不是严格的弱序:。然而,我似乎不知道这四个选项中哪一个是无效的。它也没有说明你提到的含义,它只是说明不可比性是一种等价关系。我不太确定,但我找不到一个偏序的反例,其中不可比性不是一个等价关系,其中a和b的不可比性定义为不可比(艾德佩德,别担心我。你的假设是错误的。所有严格弱序都是偏序,但并非所有偏序都是严格弱序。严格弱序是一种偏序,它具有不可比传递性的附加属性。如果你事先不知道邻接列表,你就没有足够的幸运来完善它从偏序到严格弱序,我想这个问题应该有帮助:我明白了,但是,对于拓扑序,我应该使用什么(@Herbert the comparator
p.a+p.b
是一个非常弱的比较器,是对你的比较器的改进。聪明的技巧,谢谢你。如果你愿意将它附加到你的答案中,那就太好了!
tpc(x, z);
struct refined_comparator {
    bool operator()(const pair &p, const pair &q) const { return p.a + p.b < q.a + q.b; }
} rc;