如何比较priority_queue中的两个元素

时间:2015-09-30 14:48:15

标签: c++

我定义了priority_queue<pair<double, int>>。较小的double值具有较高的优先级。如果队列中有多个相同的double值,则随机弹出一个。例如:(<0.1, 1>, <0.1,2>, <0.1, 0>,<0.1,5>),如何随机弹出其中一个?我不确定我的想法是否合理。因为元素的位置已经确定,所以当它被推入队列时。

2 个答案:

答案 0 :(得分:2)

如果&#34;随机&#34;你的意思是它应该在double的最低值的所有项目中执行真实(伪)随机选择,那么std::priority_queue不能为你做什么 - 它不是为此而设计的。您最好的选择是在优先级相同的情况下弹出并保存所有项目,然后随机选择一个并将其余部分重新插入队列。

另一方面,如果你的意思是&#34;随机&#34;就像在&#34;其中任何一个都是好的,&#34;那么您可以使用自定义比较器来执行此操作,该比较器仅考虑该对的first数据成员的值。当这些同意将取决于优先级队列的内部实现(以及可能还有插入顺序)时,哪一个被弹出。出于许多目的,这可能是随机的&#34;够了。

在代码中,第二个选项如下所示:

struct DoublePriority
{
  bool operator() (const std::pair<double, int> &lhs, const std:pair<double, int> &rhs) const {
    return lhs.first > rhs.first;
  }
};

std::priority_queue<std::pair<double, int>, std::vector<std::pair<double, int>>, DoublePriority> theQueue;

答案 1 :(得分:2)

您可以存储元组double, int, int,其中最后一个术语是比较器将用于解析等效元素比较的唯一随机数。