通过引用传递自定义优先级队列

Posted

技术标签:

【中文标题】通过引用传递自定义优先级队列【英文标题】:Passing custom priority queue by reference 【发布时间】:2016-06-12 01:10:09 【问题描述】:

我无法通过(自定义)priority_queue 引用。优先队列是使用 lambda 自定义的。有什么解决方法吗?我尝试使用仿函数和所有这些,但它们都不会让我在创建priority_queue 的过程中越过,而不会在编译步骤失败时出现priority_queue 构造函数不接受排序方法的各种问题。我猜它无法到达 lambda 或者它只需要在标头中进行一些特殊的类型声明,但我想不通

这是我的代码的简化版本。

#include <queue>
#include <memory>

struct Node

  int full_dist,
      dist1,
      dist2;

  Node(int d1, int d2)  full_dist = d1 + d2; 
;

void some_processing(std::priority_queue<std::shared_ptr<Node>>& nodes)

  //something being done with the queue


int main()

  auto comp = [] (const std::shared_ptr<Node>& l, const std::shared_ptr<Node> r) -> bool 
     return l->full_dist > r->full_dist; ;

  std::priority_queue<std::shared_ptr<Node>, std::vector<std::shared_ptr<Node>>, decltype(comp)> nodes(comp);
  some_processing(nodes);//breaks here

这是我在这个例子中遇到的错误:

test.cpp:24:24: error: invalid initialization of reference of type ‘std::priority_queue<std::shared_ptr<Node> >&’ 
from expression of type ‘std::priority_queue<std::shared_ptr<Node>, std::vector<std::shared_ptr<Node>, std::allocator<std::shared_ptr<Node> > >, main()::__lambda0>’
some_processing(nodes);

【问题讨论】:

【参考方案1】:

使函数在比较类型上模板化。

template<typename CompT>
void some_processing(
    std::priority_queue<std::shared_ptr<Node>,
                        std::vector<std::shared_ptr<Node>>,
                        CompT> & nodes)

    // something being done with the queue

或者保持简单,只将整个容器类型模板化。

template<typename QueueT>
void some_processing(QueueT& nodes)

    // something being done with the queue

【讨论】:

非常感谢,这解释了很多【参考方案2】:

你的优先队列是

std::priority_queue<std::shared_ptr<Node>,
             std::vector<std::shared_ptr<Node>>, decltype(comp)>

这就是它的声明类型。您的函数的参数是对以下内容的引用:

std::priority_queue<std::shared_ptr<Node>>

这是一种完全不同的类型。您不能将对一种类型的引用传递给期望将完全不同类型的引用作为参数的函数。模板类的每个实例都是唯一的。第一类和第二类的区别,这里和class Aclass B的区别是一样的。

【讨论】:

我想,我只是不知道如何描述这种类型。另一个人描述了一个很好的解决方法。不过还是谢谢你的回答

以上是关于通过引用传递自定义优先级队列的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义比较器的最小优先级队列

优先队列的自定义比较功能

我有一个字符串,我需要根据自定义顺序进行排序,并且我正在使用优先级队列,但优先级队列因重复而失败 [重复]

使用自定义比较器声明 C++ 优先级队列的问题

具有自定义比较功能的 C++ 优先级队列在 Push() 上行为不正确

Printer Queue,UVa 12100 (自定义标记法 + 优先队列)