优先队列清除方法

rus*_*ell 36 c++ stl

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

小智 52

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

priority_queue <int> q;
// use it
q = priority_queue <int>(); // reset it
Run Code Online (Sandbox Code Playgroud)

  • @andand当然,但队列也是如此.在任何一种情况下,你可能都需要一个智能指针队列,在这种情况下,问题(可能)就会消失. (3认同)
  • 与“clear()”方法不同,这不是异常安全的,因为它构造了一个临时的“priority_queue”对象,并且创建该临时对象可能会引发异常。 (3认同)
  • @russell是什么让你这么想的?所有标准库容器和适配器都是可分配的. (2认同)

Ric*_*ard 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;
}
Run Code Online (Sandbox Code Playgroud)