如何有效地清除c ++中的堆栈?


how can i clear a stack in c++ efficiently?

我有一个名为页面的C++堆栈。因为我没有clear()函数来清除堆栈,所以我编写了以下代码:

1
2
3
4
5
stack<string> pages;
//here is some operation
//now clearing the stack
while(!pages.empty())
    pages.pop();

现在我的问题是:有没有一种更有效的方法来清除堆栈?事先谢谢。


通常,您不能清除O(1)中的复制容器,因为您需要销毁这些副本。可以想象,模板化的复制容器可以有一个部分专用化,在O(1)时间内清除,这是由一个特征触发的,该特征指示所包含对象的类型具有一个普通的析构函数。

如果你想避免循环。

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

1
stack<std::string>().swap(pages);


我认为没有更有效的方法。堆栈是一种定义良好的数据类型,专门设计用于在后进先出的上下文中操作,不打算立即清空。为此,您可以使用vectordequelist,它们基本上是底层容器;stack实际上是容器适配器。有关更多信息,请参见此C++参考。

如果您没有选择,并且必须使用Stack,那么您的方法没有任何问题。不管是哪种方式,如果构建了元素,那么它们都必须被销毁,不管您是分配一个新的空堆栈,还是弹出所有元素,或者其他什么方式。

我建议用vector代替,它有你真正需要的操作:

  • 大小(或调整大小)
  • 空的
  • 推挽
  • 后背
  • 后面
  • 清楚的

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


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

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