Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ dijkstra算法的优先级队列_C++_Dijkstra - Fatal编程技术网

C++ dijkstra算法的优先级队列

C++ dijkstra算法的优先级队列,c++,dijkstra,C++,Dijkstra,优先级队列是如何工作的? 我开始研究Dijkstra的算法,在谷歌上搜索,得到了很多代码,不同的程序员使用不同版本的优先级队列。 在一段代码中,我注意到他使用了这个声明 priority_queue <pii, vector <pii>, comp> Q; //pii means pair <int,int> // And comp is compare structure which I also cannot understand 谁能给我解释一下这

优先级队列是如何工作的? 我开始研究Dijkstra的算法,在谷歌上搜索,得到了很多代码,不同的程序员使用不同版本的优先级队列。 在一段代码中,我注意到他使用了这个声明

priority_queue <pii, vector <pii>, comp> Q;
//pii means pair <int,int>
// And comp is compare structure  which I also cannot understand 
谁能给我解释一下这里发生了什么事?在C++中,有多少个版本的代码> PrimyIyQueue/Cuth>声明,在C++中有?

也检查这个

< P> C++优先队列是:

template <class T, class Container = vector<T>,
  class Compare = less<typename Container::value_type> > class priority_queue;
注意这是如何使用两个
pii
并使用
运算符进行比较的;这与队列中的默认顺序相反

然后将该
comp
类型指定为模板的第三个参数

指定了第三个参数之后,对于模板和函数,第二个参数也必须指定,即使我们只希望与默认参数相同,
std::vector


为什么要修改底层容器的规范?这是
容器适配器
模式。其思想是优先级队列的语义不一定意味着数据存储的基本方式。此外,该标准还提供了专门针对存储的数字if数据结构。因此,为什么优先级队列不允许选择底层存储?这是适配器的概念。

如果您阅读了的参考,您可以看到第一个参数是类型,第二个参数是容器,第三个是比较类。据我所知,在C++标准中只有一个优先级队列,我使用二进制搜索树实现了我自己的自定义队列,这是一个非常有用的练习。 在zobayer博客上Dijkstra算法的例子中,由于代码中使用了宏,这一切都有点模糊。遗憾的是,这段代码太模糊了,因为它使代码更难理解


comp类(默认情况下,struct是一个所有成员都是公共的类)操作符()只需获取pii对中的第二项,并将其与另一个pii进行比较。您可以将其自定义为优先级队列中的任何类型。

实际上,我以前曾向first site寻求帮助。你能告诉我vector在声明中的用途吗?这个向量最让我困扰。再次感谢
template <class T, class Container = vector<T>,
  class Compare = less<typename Container::value_type> > class priority_queue;
struct comp {
  bool operator() (const pii &a, const pii &b) {
    return a.second > b.second;
  }
};