首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以通过清除priority_queue的底层容器来清除它吗?

问我可以通过清除priority_queue的底层容器来清除它吗?
EN

Stack Overflow用户
提问于 2016-01-21 05:56:34
回答 1查看 1.1K关注 0票数 9

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

代码语言:javascript
复制
#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测试它时,它会产生预期的输出:

代码语言:javascript
复制
-1
-2
-3
-4
-5

但是我还没有看到任何保证,也就是说,当pop()不是空的时候,清除内部向量和调用priority_queue是一样的。虽然我知道清除它的其他方法,比如交换或使用空的priority_queue分配它,但是我认为如果这段代码能够很好地工作,它会更高效,因为在向量中分配的内存是可重用的。所以我想知道这段代码是否是可移植的,还是不能始终正常工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-21 06:32:09

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

例如,考虑一下operator=的文档

复制分配操作符。将内容替换为其他内容的副本。有效地调用了c = other.c;。(默示声明)

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34916355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档