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

时间:2016-06-12 01:10:10

标签: c++ lambda std priority-queue

我无法传递(自定义)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);

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

您的优先级队列是

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之间的差异相同。