c ++ stl将参数更正为priority_queue

时间:2016-09-12 10:10:32

标签: c++ stl priority-queue dijkstra

以下是不正确的代码段。

我想使用c ++的优先级队列stl实现dijkstra。但我无法弄清楚使用此优先级与边缘类的正确语法。我想基于权重将edge放到priority_queue上。

class edge{
public: 
    int src;
    int dest;
    int wt;
};

class comp {
bool operator() (int a, int b) {
    if(a<=b){
        return true;
    }else{
        return false;
    }
   }
};


priority_queue<int,edge,comp> check;

edge e1,e2,e3;
e1.dest=1;
e2.dest=2;
e3.dest=3;

2 个答案:

答案 0 :(得分:0)

#include <queue>
#include <iostream>

class edge{
public:
    int src;
    int dest;
    int wt;
};

struct less_weight {
    bool operator() (const edge& a, const edge& b) {
        return a.wt < b.wt;
    }
};

struct greater_weight {
    bool operator() (const edge& a, const edge& b) {
        return a.wt > b.wt;
    }
};

int main()
{
    std::priority_queue<int,std::vector<edge>,less_weight> prioritise_higher_weights;
    prioritise_higher_weights.push(edge{0, 1, 1 });
    prioritise_higher_weights.push(edge{1, 2, 2 });
    prioritise_higher_weights.push(edge{2, 3, 3 });

    std::priority_queue<int,std::vector<edge>,greater_weight> prioritise_lower_weights;
    prioritise_lower_weights.push(edge{0, 1, 1 });
    prioritise_lower_weights.push(edge{1, 2, 2 });
    prioritise_lower_weights.push(edge{2, 3, 3 });

    std::cout << prioritise_higher_weights.top().wt << std::endl;
    std::cout << prioritise_lower_weights.top().wt << std::endl;
}

预期产出:

3
1

注意优先级队列如何按给定谓词的倒数排序。

答案 1 :(得分:0)

首先阅读 spec for priority_queue 。说真的,读一读。

请注意,第一个模板参数是您要存储的类型,因此如果您要存储Edge,那么Edge应该是您的第一个参数。

第二个模板参数是priority_queue将在下面使用的容器,用于存储您提供的值。默认情况下,std::vectorEdge,我认为它足以用于演示目的。

第三个模板参数是用于比较队列中将存储的值的比较器。由于您要存储Edge,因此您需要一个能够比较int个实例而不是#include <vector> #include <queue> class Edge{ public: int src; int dest; int wt; }; struct comp { // note the use of references bool operator() (const Edge& a, const Edge& b) { // comparison by edge weights return a.wt < b.wt; } }; int main() { std::vector<Edge> storage; comp compare; std::priority_queue<Edge, std::vector<Edge>, comp> check(compare); Edge e1,e2,e3; e1.wt=1; e1.src=1; e1.dest=2; e2.wt=2; e2.src=1; e2.dest=2; e3.wt=3; e3.src=2; e3.dest=3; check.push(e1); // pushing the maximum in the middle, let's see where it gets check.push(e3); check.push(e2); // let's see what's on top const Edge& top=check.top(); std::cout << "weight: "<< top.wt << " src:" << top.src << " dest:" << top.dest << std::endl; // got the maximum on top } s的比较器类。

如上所述,试试这个:

set +x
docker rmi `docker images -aq`