c++ 优先队列清除方法

j8yoct9x  于 2023-03-25  发布在  其他
关注(0)|答案(7)|浏览(986)

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

cmssoen2

cmssoen21#

priority_queue接口没有clear()方法(我一直没能看出原因)。一个简单的方法就是分配一个新的空队列:

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

uttx8gqw2#

priority_queue没有一个clear方法。这可能是为了接口的简单性,也可能是因为在某些情况下,元素必须按优先级顺序销毁,这使得通用的clear函数不安全。
无论如何,下面的代码块包含了两个清除优先级队列的函数。第一个函数的工作原理是围绕priority_queue构建一个 Package 类的临时示例,然后使用它来访问底层存储对象,假设它有一个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;
}
n3schb8v

n3schb8v3#

这里有一个干净简单的方法来清除任何priority_queue(和queue,以及大多数其他容器):

template <class Q>
void clearQueue(Q & q) {
    q = Q();
}

因为它是一个模板,所以您不必记住所有的模板参数。
示例:

std::priority_queue<MyType> simpleQueue;
std::priority_queue<MyType, std::deque<MyType>, MyHashFunction> customQueue;

// ... later ...

clearQueue(customQueue);
clearQueue(simpleQueue);
lymgl2op

lymgl2op4#

正如任何C++ STL参考将向您展示的那样,STL优先级队列类没有类似'clear'或'erase'的函数。http://www.cplusplus.com/reference/stl/priority_queue/
它是一个容器类,因此,编译器会生成一个非常简单的析构函数(在大多数情况下)。如果优先级队列在其节点中只使用本地分配的信息,那么这应该可以很好地清除内存。
但是,如果您已经为优先级队列中的信息动态分配了内存,则需要手动创建一个类似于“clear”的函数。
希望这有帮助!

3z6pesqy

3z6pesqy5#

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 = {};
nhhxz33t

nhhxz33t6#

你可以使用std::priority_queue::c方法与std::vector::clear方法结合使用,或者分配一个新的容器来清除优先级队列的内容。下面是一个例子:

#include <iostream>
#include <queue>
#include <vector>

template <typename T>
class MyPriorityQueue : public std::priority_queue<T>
{
public:
    void clear() {
        this->c = std::vector<T>();
    }
};

int main() {
    MyPriorityQueue<int> pq;
    pq.push(1);
    pq.push(2);
    pq.push(3);

    pq.clear();

    std::cout << "The priority queue is now empty" << std::endl;
    return 0;
}

根据容器的大小,您可能只是从队列中弹出元素,因为它可能比内存分配更快,因此您必须测试两种方法并比较经验结果

2ul0zpep

2ul0zpep7#

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

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

相关问题