template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue;
我理解前两个模板参数,第一个模板参数是存储在优先级队列中的元素的数据类型,第二个是程序员想要使用的容器类型,它可以是deque或者矢量。
但是第三个论点让我感到困惑,因为我从来没有见过类似的东西。我做过类似的事情:
template <class T, class Container = vector<T>
class priority_queue{
/* Implementation */
};
是否与优先级队列所需的严格弱排序标准有关?如果是,我怎样才能了解更多信息?你能给出一个使用第三个参数的例子吗?
我是模板编程的新手,所以我非常感谢你的帮助。
答案 0 :(得分:1)
第三个参数指定比较器类。
比较器类负责比较队列元素,以确定队列顺序。您已经了解队列中的元素是按照&#34;更高的&#34;进行排序的。价值第一。嗯,这就是定义什么&#34;更高&#34;意思是,这里。
比较器类有一个简单的接口:给定两个值,如果第一个值小于第二个值,则返回true
,否则返回false
。默认实现std::less
使用传统的<
运算符来比较这两个值。
使用自定义比较器类来更改优先级队列的行为。一个例子是指定std::greater
而不是std::less
作为比较器类。 std::greater
使用>
运算符,因此会以相反的顺序创建一个优先级队列&#34;&#34;,它首先为您提供最低值,而不是最高值。
或者,您可以创建自己的自定义比较器类,例如:
class last_four_bits {
public:
bool operator()(int a, int b) const
{
return (a & 0x0F) < (b & 0x0F);
}
};
此比较器类仅比较int
的最少四位。反过来,这就是:
std::priority_queue<int, std::vector<int>, last_four_bits>
查看队列中每个int
值的至少四位,从而在具有较小值的值之前排序最后四位中具有最高值的所有int
,忽略所有其他值int
中的位。
P.S。比较器类还与关联容器set
和map
一起使用,并在那里提供相同的功能。通过精心设计比较器类,您可以创建集合和映射,其迭代器以最低到最高键之外的某种顺序迭代集合/映射中的键(如您所理解的那样&#34;最低&#34;和&#34 ;最高&#34;表示,本质上。