如何解释优先级队列的模板签名?

How do I interpret this template signature of priority queue?

本文关键字:队列 优先级 何解释 解释      更新时间:2023-10-16
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 */
};

它与优先级队列所需的严格弱排序标准有关吗?如果是,我怎样才能了解更多信息?你能举一个使用第三个参数的例子吗?

我是模板编程的新手,所以我非常感谢你的帮助。

第三个参数指定比较器类。

比较器类负责比较队列元素,以确定队列顺序。您已经了解队列中的元素首先以"较高"值排序。好吧,这就是定义"更高"的含义的原因。

比较器类有一个简单的接口:给定两个值,如果第一个值小于第二个值,则返回true,否则false返回。默认实现std::less使用传统的<运算符来比较这两个值。

使用自定义比较器类为了更改优先级队列的行为。一个例子是指定std::greater而不是std::less作为比较器类。std::greater使用>运算符,因此这会"以相反的顺序"创建一个优先级队列,它首先为您提供最低值,而不是最高值。

或者,您可以创建自己的自定义比较器类,例如:

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. 比较器类也与关联容器一起使用,sets 和maps,并在那里提供相同的功能。通过精心制作比较器类,您可以创建集合和映射,其迭代器以某种顺序迭代集合/映射中的键,而不是从最低到最高的键(正如您理解的"最低"和"最高"本质上的意思)。