【发布时间】:2016-03-05 01:42:53
【问题描述】:
我有一个 Dijkstra 类,它使用带有自定义比较功能的 priority_queue。我用using 语句将队列命名为DijkstraPriorityQueue。在类构造函数中,我初始化了队列。为此,我在 lambda 表达式中给出了比较函数。
对于第一个队列PQ1,比较函数是{ return distTo[u] > distTo[v]; },并且编译正常,因为vector<float> distTo 是该类的成员。
但是对于第二个队列PQ2,函数是{ return distTo2[u] > distTo2[v]; },其中vector<float> distTo2 只是构造函数中的一个临时变量,并且无法编译。 (我认为至少是这个原因)
另外,我随机尝试通过直觉将vector<float> distTo2 更改为static vector<float> distTo2 并编译,但我不认为这是我想要做的。我不熟悉函数内部的静态变量,因为 Java 或 C# 中不存在静态变量。无论如何,让下面的代码按预期编译和工作的干净解决方案是什么?
Dijkstra.h
class Dijkstra
{
public:
Dijkstra();
~Dijkstra();
private:
vector<float> distTo;
};
Dijkstra.cpp
using DijkstraPriorityQueue = priority_queue<int, vector<int>, function<bool(int, int)>>;
Dijkstra::Dijkstra()
{
distTo = vector<float>(V, FLT_MAX);
// Compiles fine
DijkstraPriorityQueue PQ1 = DijkstraPriorityQueue([this](int u, int v)
{ return distTo[u] > distTo[v]; });
vector<float> distTo2 = vector<float>(V, FLT_MAX);
// Doesn't compile
DijkstraPriorityQueue PQ2 = DijkstraPriorityQueue([this](int u, int v)
{ return distTo2[u] > distTo2[v]; });
}
编辑:
以下代码也可以编译。任何线索为什么?有人能解释一下 lambda 表达式上的 capture 是什么吗?或者在这种特定情况下我应该如何正确编写我的代码?
DijkstraPriorityQueue PQ2 = DijkstraPriorityQueue([distTo2](int u, int v)
{ return distTo2[u] > distTo2[v]; });
【问题讨论】:
标签: c++ priority-queue