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。认真的,读一读。

注意第一个模板参数是你要存储的类型,所以如果你想存储Edges,那么Edge应该是你的第一个参数。

第二个模板参数是priority_queue 在下面用来存储您提供的值的容器。默认情况下是std::vector,我认为对于演示目的来说已经足够了。

第三个模板参数是比较器,用于比较您将存储在队列中的值。由于您存储的是Edges,因此您需要一个能够比较Edge 实例而不是ints 的比较器类。

上面说了,试试这个:

#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 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

STL之容器适配器priority_queue

C++ STL:优先级队列priority_queue的使用方法和模拟实现

C++中 priority_queue 的用法总结

C++STL之ACM相关知识大全

如何更正EXCEL中的#NUM!错误

我们如何打印出C ++ STL容器的value_type?