优先队列清除方法

时间:2010-05-17 19:30:36

标签: c++ stl

如何从优先级队列中删除所有元素?这意味着如何销毁优先级队列? 谢谢您的回答。是否有任何类似于清除或擦除的方法?

5 个答案:

答案 0 :(得分:46)

priority_queue接口没有clear()方法(没有任何理由我曾经能够辨别)。清除它的一种简单方法就是分配一个新的空队列:

priority_queue <int> q;
// use it
q = priority_queue <int>(); // reset it

答案 1 :(得分:6)

priority_queue没有明确的方法。这可能是因为界面简单,或者因为可能存在必须按优先级顺序销毁元素的情况,使得通用的清除函数不安全。

无论如何,以下代码块包括清除优先级队列的两个功能。第一种方法是在priority_queue周围构建一个包装类的临时实例,然后使用它来访问底层存储对象,假设它有一个clear()方法。第二种方法是将现有priority_queue替换为新队列。

我使用模板,以便可以一次又一次地回收这些功能。

#include <queue>
#include <iostream>
using namespace std;

template <class T, class S, class C>
void clearpq(priority_queue<T, S, C>& q) {
    struct HackedQueue : private priority_queue<T, S, C> {
        static S& Container(priority_queue<T, S, C>& q) {
            return q.*&HackedQueue::c;
        }
    };
    HackedQueue::Container(q).clear();
}

template <class T, class S, class C>
void clearpq2(priority_queue<T, S, C>& q){
    q=priority_queue<T, S, C>();
}

int main(){
    priority_queue<int> testq, testq2;

    //Load priority queue
    for(int i=0;i<10;++i)
        testq.push(i);

    testq2=testq;

    //Establish it is working
    cout<<testq.top()<<endl;
    testq.pop();
    cout<<testq.top()<<endl;
    testq.pop();

    //Clear it and prove that it worked
    clearpq(testq);
    cout<<testq.size()<<endl;

    //Use the second clearing function
    cout<<testq2.size()<<endl;
    clearpq2(testq2);
    cout<<testq2.size()<<endl;
}

答案 2 :(得分:0)

正如任何C ++ STL引用将向您显示的那样,STL Priority Queue类没有“clear”或“erase”之类的函数。 http://www.cplusplus.com/reference/stl/priority_queue/

它是一个容器类,因此,编译器会生成一个非常简单的析构函数(在大多数情况下)。如果您的优先级队列在其节点中仅使用本地分配的信息,那么这应该可以正常清除内存。

但是,如果您为优先级队列中的信息动态分配了内存,则需要手动创建一个类似“清除”的函数。

希望这有帮助!

答案 3 :(得分:0)

在c ++中,没有对priority_queue支持的清除方法,但是下面的方法是清除priority_queue的好方法,并且具有O(log(n))时间

while (!pq.empty())
      pq.pop();

答案 4 :(得分:0)

priority_queue<int> a;
a.push(10);
a.push(9);
a.push(8);
a   =   {};
a.push(1);
a.push(4);
a.push(6);

while(!a.empty())
    {
    std::cout<< a.top();
    a.pop();
    }

产生

641

所以您可以简单地

a = {};