有人可以解释如何使用std :: greater来实现priority_queue

时间:2017-10-04 17:36:55

标签: c++11 stl minimum-spanning-tree prims-algorithm

std::priority_queue<int, vector<int>, std::greater<int> > pq;

我无法理解优先级队列中std :: greater的工作。 我正在用优先级队列替换minheap。 此代码取自 geeksForGeeks implementation of Prims algorithm using STL

1 个答案:

答案 0 :(得分:1)

std::priority_queue类型就是所谓的容器适配器。它的工作原理是从可用于表示序列的类型开始,然后使用该类型构建优先级队列(特别是作为二进制堆)。默认情况下,它使用向量。

为了做到这一点,优先级队列类型必须知道如何以确定哪些元素比其他元素“更小”的方式相互比较元素。默认情况下,它使用小于运算符。

如果您制作标准std::priority_queue<int>,则会返回

的优先级队列
  • 使用std::vector进行存储,
  • 使用小于运算符来比较元素。

在许多情况下,这就是你想要的。如果将元素插入到以这种方式创建的优先级队列中,您将从最大到最小的范围内将它们读出来。

但在某些情况下,这不是您想要的行为。例如,在Prim算法和Dijkstra算法中,您希望值以升序顺序返回,而不是降序顺序。为此,您需要使用大于运算符而不是小于运算符来反转比较顺序。

为此,您需要告诉优先级队列使用不同的比较方法。遗憾的是,优先级队列类型的设计使得如果您想这样做,还需要指定要使用的底层容器。我认为这在设计中是一个错误 - 能够指定比较器而不是比较器和容器真的很好 - 但是我可以选择。其语法是

std::priority_queue<int,               // store integers...
                    std::vector<int>,  // ... in a vector ...
                    std::greater<int>> // ... comparing using >