如何比较priority_queue中的两个元素

how to compare two elements in priority_queue

本文关键字:两个 元素 何比较 比较 priority queue      更新时间:2023-10-16

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

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

如果"随机"是指它应该在所有具有最低double值的项目中执行真正的(伪)随机选择,那么std::priority_queue就不能为您做这件事;它不是为此而设计的。你最好的办法是在优先级相同的情况下弹出并保存所有项目,然后随机选择一个,并将其余的重新插入队列。

另一方面,如果您的意思是"随机",即"它们中的任何一个都是好的",那么您可以简单地使用自定义比较器来实现这一点,该比较器将只考虑对的first数据成员的值。当它们一致时,哪一个被弹出将取决于优先级队列的内部实现(也可能取决于插入顺序)。对于许多用途,这可能足够"随机"。

在代码中,第二个选项看起来像这样:
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;