如何清除c+中的堆栈+;有效地? 我有一个名为页面的C++堆栈。 由于我没有clear()函数来清除堆栈,因此我编写了以下代码: stack<string> pages; //here is some operation //now clearing the stack while(!pages.empty()) pages.pop(); 堆栈页面; //这里有一些手术 //现在清除堆栈 而(!pages.empty()) pages.pop();

如何清除c+中的堆栈+;有效地? 我有一个名为页面的C++堆栈。 由于我没有clear()函数来清除堆栈,因此我编写了以下代码: stack<string> pages; //here is some operation //now clearing the stack while(!pages.empty()) pages.pop(); 堆栈页面; //这里有一些手术 //现在清除堆栈 而(!pages.empty()) pages.pop();,c++,C++,现在我的问题是:有没有更有效的方法来清除堆栈?一般来说,您无法在O(1)中清除复制容器,因为您需要销毁副本。可以想象,一个模板化的复制容器可以有一个在O(1)时间内清除的部分专门化,该部分专门化是由一个特征触发的,该特征指示所包含对象的类型具有一个平凡的析构函数 如果你想避免循环 pages=stack<std::string>(); pages=stack(); 或 stack().swap(页面); 我认为没有比这更有效的方法了。堆栈是一种定义良好的数据类型,专门设计用于在后

现在我的问题是:有没有更有效的方法来清除堆栈?

一般来说,您无法在O(1)中清除复制容器,因为您需要销毁副本。可以想象,一个模板化的复制容器可以有一个在O(1)时间内清除的部分专门化,该部分专门化是由一个特征触发的,该特征指示所包含对象的类型具有一个平凡的析构函数

如果你想避免循环

pages=stack<std::string>();
pages=stack();

stack().swap(页面);

我认为没有比这更有效的方法了。堆栈是一种定义良好的数据类型,专门设计用于在后进先出上下文中操作,而不是立即清空。 为此,您可以使用
vector
deque
(或
list
),它们基本上是底层容器;
堆栈实际上是一个容器适配器。更多信息请参见此

如果您没有选择,并且必须使用stack,那么您的方式就没有问题。无论是哪种方式,如果元素被构造,那么它们都必须被销毁,无论您是分配一个新的空堆栈,还是弹出所有元素,或者其他什么

我建议使用
向量
;它具有您确实需要的操作:

  • 大小(或调整大小)
  • 空的
  • 推回
  • 弹回
  • 清楚的

它更方便,因此您可以使用
clear
方法。不确定使用
vector
是否真的更有效;堆栈操作基本上是相同的。

对std::stack进行子类化并实现这样一个简单的clear()方法,访问底层容器c怎么样

public:
    void clear() { c.clear(); }

你试过给你的堆栈分配一个空堆栈吗?没有,谢谢你的建议。你问了效率问题。创建新堆栈可能不会更有效,因为它会导致更多的堆分配。默认情况下,基础容器将是
deque
。如果使用
deque
vector
,您将丢弃已为容器声明的已分配内存,否则这些内存可能会被重用。@PaulRooney同样的参数也可以反过来使用。在循环中使用琐碎的析构函数销毁类型可能比(可能省略)分配更浪费。此外,保留分配的内存可能与他想要的相反。当然,这取决于做出明智的决定。我并不是说一个比另一个好,只是根据OP的需要来考虑。这是非标准的,也是个坏主意。基础容器名称将根据实现的不同而变化,并且不能保证实现不依赖于基础容器以外的某些变量,清除它可能会损坏堆栈的状态。尽管对此答案有批评,但这似乎是最有效的解决方案,如果不是最可移植的。有没有一种方法(在C++14中)可以做到这一点而不必显式地声明类型?所有容器都有
清除
--除了
数组
。原因是
堆栈
没有
清除
?如果是这样的话,那么避免或忽略这个异常不是更有用吗?使用
堆栈时,没有
清除
似乎很奇怪。@JohnH。是:
pages={}当我使用它时,它会清空所有其他堆栈,我不确定出了什么问题。可能所有堆栈都只是一个实际对象的引用@约瑟夫。
public:
    void clear() { c.clear(); }