通常我们可以使用heap.find(value)查找优先级队列中是否存在值。如果它不存在,它将返回end()。
现在我有一个优先级队列,它定义如下
priority_queue<pair<int,int>, vector<pair<int,int>>, fun> min_heap;
我想基于对中的值来查找是否存在一对。如何找到它?
答案 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多次使用它,你可以创建一个模板功能。