优先队列如何运作? 我开始研究Dijkstra的算法,用Google搜索并获得了很多代码,其中不同的编码器使用不同版本的优先级队列。 在一个代码中,我注意到他使用了这个声明
priority_queue <pii, vector <pii>, comp> Q;
//pii means pair <int,int>
// And comp is compare structure which I also cannot understand
Comp就像这样
struct comp {
bool operator() (const pii &a, const pii &b) {
return a.second > b.second;
}
};
有人可以解释一下这里发生了什么吗?在c ++中还有多少版本的priority_queue
声明?
答案 0 :(得分:1)
C ++优先级队列是:
template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;
在此:
T
是要存储在队列中的类型;希望这很明显。
Container
是队列中的底层存储。如声明所示,默认为std::vector<T>
,通常可以忽略它。
Compare' is the method for determining the ordering in the queue. Again, it has a default and can often be ignored.
Compare`是一个支持函数调用的类型,它可以比较队列中的两个元素并确定它们的顺序。
less
是默认值,只需应用普通<
运算符即可。
当需要除<
定义的排序之外的其他排序时,可以定义提供所需比较的类型。你有:
struct comp {
bool operator() (const pii &a, const pii &b) {
return a.second > b.second;
}
};
注意这需要两个pii
,并使用>
运算符进行比较;这与队列中的默认排序相反。
然后将此comp
类型指定为模板的第三个参数。
指定了第三个参数,然后使用模板和函数一样,即使我们只想要与默认值std::vector<pii>
相同,也必须指定第二个参数。
为什么指定底层容器?这是container adaptor
模式。这个想法是优先级队列的语义不一定意味着数据存储的基本方式。如果数据结构专门关注存储,标准也提供了一个数字。因此,为什么不让priority_queue允许选择底层存储?这是适配器概念。
答案 1 :(得分:0)
答案 2 :(得分:0)
如果您阅读priority_queue的引用,您可以看到第一个参数是类型,第二个参数是容器,第三个参数是比较类。另外据我所知,C ++标准中只有一个优先级队列,我使用二叉搜索树实现了自己的自定义队列,这是我推荐的非常有用的练习。
在zobayer博客的Dijkstra算法示例中,由于在代码中使用了宏,所以这有点混淆。令人遗憾的是,这段代码非常模糊,因为它使代码更难以遵循。
comp类(结构是默认情况下所有成员都是public的类)operator()只接受pii对中的第二项并将其与另一个pii进行比较。您可以根据优先级队列中的类型自定义它。