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

时间:2017-01-15 23:32:43

标签: c++ templates

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 */
};

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

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

1 个答案:

答案 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。比较器类还与关联容器setmap一起使用,并在那里提供相同的功能。通过精心设计比较器类,您可以创建集合和映射,其迭代器以最低到最高键之外的某种顺序迭代集合/映射中的键(如您所理解的那样&#34;最低&#34;和&#34 ;最高&#34;表示,本质上。