具有priority_queue的Dijkstras算法

时间:2013-08-06 23:33:01

标签: c++ priority-queue path-finding dijkstra

我正在尝试实现Dijkstra的算法。我正在使用此priority_queue

priority_queue<pair<PathInfo,string>,vector<pair<PathInfo,string> >,QueueComp> p;

其中

class QueueComp{
    PathComp* pc;
public:
    QueueComp(PathComp*);
    bool operator ()(const pair<PathInfo,string>&,const pair<PathInfo,string>& );
};

是我的“比较”功能。错误是QueueComp 没有默认构造函数,我不允许创建一个。我该怎么做才能编译我的代码?顺便说一下这是错误

error: no matching function for call to 'QueueComp::QueueComp()'

这是pathcomp.h

class PathComp{
public:
   virtual bool betterThan(const PathInfo& path1,const PathInfo& path2)=0;
};

这是pathcomppl.h

#include "pathcomp.h"

class PathCompPL:public PathComp{
public:
virtual bool betterThan(const PathInfo& path1,const PathInfo& path2);
};

这是pathcomppl.cpp

#include "pathcomppl.h"

bool PathCompPL::betterThan(const PathInfo& path1,const PathInfo& path2){
    if (path1.getTotalPrice()>path2.getTotalPrice())
        return true;

    if (path1.getTotalPrice()==path2.getTotalPrice() && path1.getTotalLength()>path2.getTotalLength())
        return true;

    return false;
}

扩展错误消息

main.cpp: In constructor ‘std::priority_queue<_Tp, _Sequence, _Compare>::priority_queue(const _Compare&, const _Sequence&) [with _Tp = std::pair<PathInfo, std::basic_string<char> >; _Sequence = std::vector<std::pair<PathInfo, std::basic_string<char> > >; _Compare = QueueComp]’:
main.cpp:11:87: error: no matching function for call to ‘QueueComp::QueueComp()’
main.cpp:11:87: note: candidates are:
In file included from main.cpp:5:0:
queuecomp.h:14:5: note: QueueComp::QueueComp(PathComp*)
queuecomp.h:14:5: note:   candidate expects 1 argument, 0 provided
queuecomp.h:10:7: note: QueueComp::QueueComp(const QueueComp&)
queuecomp.h:10:7: note:   candidate expects 1 argument, 0 provided

3 个答案:

答案 0 :(得分:2)

您需要使用其他参数初始化优先级队列,因为您有非默认构造函数。

priority_queue<pair<PathInfo,string>,vector<pair<PathInfo,string> >,QueueComp> p(QueueComp(ptrToPathCompObject));

附加参数(QueueComp(ptrToPathCompObject))应该可以解决您的问题。

我假设你已经在QueueComp类中实现了operator()

答案 1 :(得分:0)

您没有默认构造函数,因为您应该初始化名为pc的变量。你有这个构造函数:

QueueComp(PathComp*);

你必须实现它,以便pc与参数相关联。

关于你的第二个问题:第一个元素是你的下一个优先级,第二个元素是低优先级的集合,第三个元素是队列比较。我希望这会对你有所帮助。

答案 2 :(得分:0)

看起来您的问题在于实施适当的比较器。您可以考虑的另一种方法是创建比较器,如下所示

struct CompareEdgeWeights : public binary_function<PathInfo*, PathInfo*, bool>
    {
        bool operator()(const PathInfo* left, const PathInfo* right) const
        {
            return left->getEdgeWeight() > right->getEdgeWeight();
        }
    }; // end struct

// Priority queue of node edges
priority_queue<PathInfo*,vector<PathInfo*>,CompareEdgeWeights > * edgePriorityQueue;

让这个结构从binary_function继承并重载operator()。然后,您可以将其用作比较器,以保持边缘从最低到最高权重值排序。注意:您可能需要稍微调整一下以符合您的实现。如果没有看到更多的实施,很难给出100%正确的建议。