如何解释优先级队列的模板签名?
How do I interpret this template signature of priority queue?
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. 比较器类也与关联容器一起使用,set
s 和map
s,并在那里提供相同的功能。通过精心制作比较器类,您可以创建集合和映射,其迭代器以某种顺序迭代集合/映射中的键,而不是从最低到最高的键(正如您理解的"最低"和"最高"本质上的意思)。
相关文章:
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 带自定义比较器的最小优先级队列
- 优先级队列自定义比较器
- 排序数组优先级队列
- 更改运行时优先级队列的排序功能
- 优先级队列构造函数的工作
- 实现优先级队列
- 优先级队列功能比较
- 在C++中打印对的优先级队列的所有值时出现问题
- 使用堆的优先级队列,具有相同键的值不遵循 FIFO(先进先出)
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 是否可以使用简单队列创建优先级队列
- 如何在 c++ 中创建对的优先级队列.这会弹出具有最小值的元素.默认的弹出最大值
- Cython中带有自定义比较器的优先级队列
- 优先级队列比较器[C++].
- asio::io_service 具有多个线程的优先级队列处理