下面的代码继承了std::priority_queue,并提供了调用内部std::vector的clear()的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();
}
}当我用g++、MSVC++和clang测试它时,它会产生预期的输出:
-1
-2
-3
-4
-5但是我还没有看到任何保证,也就是说,当pop()不是空的时候,清除内部向量和调用priority_queue是一样的。虽然我知道清除它的其他方法,比如交换或使用空的priority_queue分配它,但是我认为如果这段代码能够很好地工作,它会更高效,因为在向量中分配的内存是可重用的。所以我想知道这段代码是否是可移植的,还是不能始终正常工作?
发布于 2016-01-21 06:32:09
一个很好的问题。虽然我似乎找不到任何严格的保证,这是一个正确的方法,但有一些理由认为它是。
例如,考虑一下operator=的文档
复制分配操作符。将内容替换为其他内容的副本。有效地调用了
c = other.c;。(默示声明)
由于另一个队列的大小可能不同,这在本质上意味着不存在依赖于大小的内部状态。此外,它还意味着分配一个空队列实际上是用空队列替换容器,而不执行其他操作。
考虑到这一点,而且一个优先级队列的合理实现除了队列的大小之外,几乎不需要保持任何状态,我相信可以安全地假定清除底层容器是清空队列的一种有效方法。
https://stackoverflow.com/questions/34916355
复制相似问题