我可以通过清除其底层容器来清除priority_queue吗?

Jam*_*mes 8 c++ c++11

以下代码继承std :: priority_queue并提供clear()调用内部std::vector的代码clear()

#include<iostream>
#include<queue>
using namespace std;
template<class type>
struct mypq :public priority_queue<type> {
    void clear(){
        this->c.clear();
    }
};
mypq<int>pq;
int main() {
    for(int i=0;i<10;++i)
        pq.push(i);
    pq.clear();
    for(int j=-5;j<0;++j)
        pq.push(j);
    while (!pq.empty()){
        cerr<<pq.top()<<endl;
        pq.pop();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用g ++,MSVC++和clang测试它时,它会产生预期的输出:

-1
-2
-3
-4
-5
Run Code Online (Sandbox Code Playgroud)

但我没有看到任何保证,即清除内部向量将pop()与priority_queue不为空时调用相同.虽然我知道其他方法来清除它,比如交换或使用空的priority_queue分配它,但我认为如果这个代码能够很好地工作,那么它会更有效,因为向量中分配的内存是可重用的.所以我想知道这段代码是可移植的还是不会一直有效?

Ser*_*nov 1

这是一个很好的问题。虽然我似乎找不到任何严格保证它是正确的方法,但有一些理由认为它是正确的。

例如,考虑以下文档operator=

复制赋值运算符。将内容替换为其他内容的副本。有效调用c = other.c;. (隐含声明)

由于另一个队列的大小可能不同,这本质上意味着不存在依赖于大小的内部状态。此外,它还意味着分配一个空队列本质上是用一个空队列替换容器,并且不执行任何其他操作。

考虑到这一点,并且事实上优先级队列的合理实现几乎不需要维护除队列大小之外的任何状态,我相信可以安全地假设清除底层容器是清空底层容器的有效方法。队列。