我有一个名为pages的C++栈。 由于没有clear()函数可以清空栈,所以我编写了以下代码:
stack<string> pages;
//here is some operation
//now clearing the stack
while(!pages.empty())
pages.pop();
现在我的问题是:是否有更好的高效方式来清空栈?
我有一个名为pages的C++栈。 由于没有clear()函数可以清空栈,所以我编写了以下代码:
stack<string> pages;
//here is some operation
//now clearing the stack
while(!pages.empty())
pages.pop();
现在我的问题是:是否有更好的高效方式来清空栈?
通常情况下,你无法在O(1)的时间内清空复制容器,因为你需要销毁这些副本。但是,一个模板化的复制容器可能会有一个偏特化,以O(1)时间清空,并且由指示所包含对象类型具有平凡析构函数的特征触发。
如果你想避免循环操作。
pages=stack<std::string>();
或者stack<std::string>().swap(pages);
array
之外,所有容器都有clear
函数。这是为什么stack
没有clear
函数的原因吗?如果是这样,忽略或避免这个例外岂不更有用?在使用stack
时,没有clear
函数似乎很奇怪。 - John H.pages = {};
- jhasse我认为没有更有效的方法了。栈是一种定义明确的数据类型,专门设计用于LIFO上下文中操作,并且不打算一次性清空。
为此,您可以使用vector
或deque
(或list
),它们基本上是基础容器; stack
实际上是一个容器适配器。有关更多信息,请参见此C++参考文献。
如果您别无选择,必须使用栈,那么您所做的方式就没有错。无论如何,如果构造了元素,这些元素都必须被销毁,无论是分配新的空栈还是弹出所有元素等等。
我建议改用vector
; 它确实具有您需要的操作:
这只是更方便,因此您可以使用clear
方法。不确定是否真正使用vector
会更高效; 栈操作基本相同。
把一个新的空栈分配给它怎么样?
pages = stack<string>();
它不会逐个删除元素,并且使用移动赋值,因此具有潜力非常快。
stack.reset();
stack = make_shared<stack<string>>();
public:
void clear() { c.clear(); }
deque
。如果你使用一个deque
或vector
,你将浪费已经为容器声明的分配内存,否则这些内存可以被重复利用。 - Paul Rooney