如何在Pirority_queue中找到包含pair <int,int>的值?

时间:2018-05-15 12:20:33

标签: c++ stl priority-queue

通常我们可以使用heap.find(value)查找优先级队列中是否存在值。如果它不存在,它将返回end()。

现在我有一个优先级队列,它定义如下

priority_queue<pair<int,int>, vector<pair<int,int>>, fun> min_heap;

我想基于对中的值来查找是否存在一对。如何找到它?

2 个答案:

答案 0 :(得分:4)

std::priority_queue不提供除​​顶部元素以外的元素的任何访问权限,也不允许外部访问底层容器。因此,如果您需要可迭代的优先级队列,则必须自己编写代码。你可以创建这样的东西:

template <class T, class Container = std::vector<T>, class Compare = std::less<typename Container::value_type>>
class IterableQueue : public std::priority_queue<T, Container, Compare>
{
public:
  using std::priority_queue<T, Container, Compare>::priority_queue;

  const Container& container() const { return this->c; }
};

请注意,一般来说,公开继承标准库容器是个坏主意(比如上面的例子),因为它们没有虚拟析构函数,因此允许转换到基本容器是有潜在危险。

在生产代码中,最好采用私有继承并发布(通过using声明)您想要访问的成员(基本上只是所有成员)。

还要注意,给外部世界非const访问底层容器是一个非常糟糕的主意,因为它可能会违反优先级队列的不变量并导致未定义的行为。

答案 1 :(得分:1)

您可以创建一个相同类型的tmp优先级队列,将原始PQ传递给构造函数以复制元素,当然您可以检查顶部并弹出,直到找到您想要的对或新的PQ为空:< / p>

pair<int, int> wantedPair = {5, 3};
bool found = false;
priority_queue<pair<int,int>, vector<pair<int,int>>, fun> tmp(min_heap);
while(tmp.empty() == false) {
    if (wantedPair == tmp.top()) {
        found = true;
        break;
    }

    tmp.pop();
}

如果你想用不同种类的PQ多次使用它,你可以创建一个模板功能。