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

Passing custom priority queue by reference

我无法通过(自定义)priority_queue 参考。优先级 queue 是使用 lambda 自定义的。有什么解决方法吗?我尝试使用函子和所有这些,但是 none 会让我完全超越 priority_queue 创建的界限,而不会在编译步骤中因 priority_queue 构造函数不会出现的各种问题而失败' t 接受排序方法。我猜它无法到达 lambda 或者它只需要在 header 中进行一些特殊的类型声明,但我无法弄清楚

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

#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);

将函数模板化为比较类型。

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
}

您的优先队列是

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

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

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

这是完全不同的类型。您不能将对一种类型的引用传递给期望将对完全不同类型的引用作为参数的函数。模板 class 的每个实例都是唯一的。第一个和第二个 class 之间的差异与 class Aclass B 之间的差异相同。