【问题标题】:How do I interpret this template signature of priority queue?如何解释优先队列的这个模板签名?
【发布时间】:2017-01-16 07:54:06
【问题描述】:
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 */
};

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

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

【问题讨论】:

  • 它指定了你想如何比较队列中的东西,以确定它们的优先级。默认情况下,它将使用 std::less。
  • 第一个、第二个和第三个参数本质上是一样的——你到底有什么不明白的?由于您显然已经搜索过 bing.com/search?q=c%2B%2B+priority_queue+what+is+compare+for 之类的内容,因此您已经看到了用法示例 - 不知道您为什么在帖子中要求它...
  • @Alexei 怎么一样?
  • @latedeveloper 问题(见标题)主要是关于阅读签名 - 所以第二个和第三个参数的格式相同 - class c = type&lt;other_type&gt;。我假设 OP 已经阅读了文档并且知道 Compare 的用途...

标签: c++ templates


【解决方案1】:

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

比较器类负责比较队列元素,以确定队列顺序。您已经了解队列中的元素首先使用“更高”值排序。嗯,这就是“更高”的含义。

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

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

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

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 值的至少四位,从而将所有ints 的最后四位中的最高值排在具有较小值的之前,忽略@ 中的所有其他位987654334@.

附:比较器类也用于关联容器sets 和maps,并在那里提供相同的功能。通过精心设计一个比较器类,您可以创建集合和映射,其迭代器以某种顺序迭代集合/映射中的键,而不是从最低到最高键(正如您理解的“最低”和“最高”本质上的意思) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多