【问题标题】:Can someone explain how std::greater is used to implement priority_queue有人可以解释如何使用 std::greater 来实现 priority_queue
【发布时间】:2017-10-04 17:36:54
【问题描述】:
【问题讨论】:
标签:
c++11
stl
minimum-spanning-tree
prims-algorithm
【解决方案1】:
std::priority_queue 类型就是所谓的容器适配器。它的工作原理是从可用于表示序列的类型开始,然后使用该类型来构建优先级队列(特别是作为二进制堆)。默认情况下,它使用向量。
为了做到这一点,优先队列类型必须知道如何将元素相互比较,以确定哪些元素比其他元素“更小”。默认情况下,它使用小于运算符。
如果你创建一个标准的std::priority_queue<int>,你会得到一个优先队列
- 使用
std::vector 进行存储,并且
- 使用小于运算符来比较元素。
在许多情况下,这就是您想要的。如果您将元素插入以这种方式创建的优先级队列中,您会从大到小将它们读回。
但在某些情况下,这不是您想要的行为。例如,在 Prim 算法和 Dijkstra 算法中,您希望值以 升序 顺序而不是 降序 顺序返回。为此,您实际上需要使用大于运算符而不是小于运算符来颠倒比较的顺序。
为此,您需要告诉优先级队列使用不同的比较方法。不幸的是,优先队列类型的设计使得如果你想这样做,你还需要指定你想使用的底层容器。我认为这是设计中的一个错误——能够指定比较器而不是比较器和容器会非常好——但是c'est la vie。这个的语法是
std::priority_queue<int, // store integers...
std::vector<int>, // ... in a vector ...
std::greater<int>> // ... comparing using >