c ++ stl更正参数到priority_queue [关闭]
Posted
技术标签:
【中文标题】c ++ stl更正参数到priority_queue [关闭]【英文标题】:c++ stl correct parameters to priority_queue [closed] 【发布时间】:2016-09-12 10:10:31 【问题描述】:下面是错误的sn-p代码
我想使用 c++ 的优先级队列 stl 来实现 dijkstra。但我无法弄清楚将此priority_queue 与边缘类一起使用的正确语法。我想根据权重将优势放在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;
【问题讨论】:
发minimal reproducible example,比较必须是严格的弱排序。 @juanchopanza 我认为问题在于他无法发布完整的可验证示例,因为他不知道(对于初学者来说确实很复杂)语法。 【参考方案1】:#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(edge0, 1, 1 );
prioritise_higher_weights.push(edge1, 2, 2 );
prioritise_higher_weights.push(edge2, 3, 3 );
std::priority_queue<int,std::vector<edge>,greater_weight> prioritise_lower_weights;
prioritise_lower_weights.push(edge0, 1, 1 );
prioritise_lower_weights.push(edge1, 2, 2 );
prioritise_lower_weights.push(edge2, 3, 3 );
std::cout << prioritise_higher_weights.top().wt << std::endl;
std::cout << prioritise_lower_weights.top().wt << std::endl;
预期输出:
3
1
注意优先级队列如何按给定谓词的倒数排序。
【讨论】:
【参考方案2】:首先阅读spec for priority_queue。认真的,读一读。
注意第一个模板参数是你要存储的类型,所以如果你想存储Edge
s,那么Edge
应该是你的第一个参数。
第二个模板参数是priority_queue
在下面用来存储您提供的值的容器。默认情况下是std::vector
,我认为对于演示目的来说已经足够了。
第三个模板参数是比较器,用于比较您将存储在队列中的值。由于您存储的是Edge
s,因此您需要一个能够比较Edge
实例而不是int
s 的比较器类。
上面说了,试试这个:
#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
【讨论】:
以上是关于c ++ stl更正参数到priority_queue [关闭]的主要内容,如果未能解决你的问题,请参考以下文章