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

时间:2016-10-23 10:04:56

标签: c++

我有一个名为pages的c ++堆栈。 由于我没有clear()函数来清除堆栈,我编写了以下代码:

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

现在我的问题是:有更好的方法来清除堆栈吗? 提前致谢。

4 个答案:

答案 0 :(得分:21)

通常,您无法清除O(1)中的复制容器,因为您需要销毁副本。可以想象,模板化的复制容器可以具有部分特化,该特殊化在O(1)时间内被清除,该时间由特征触发,表明所包含对象的类型具有普通的析构函数。

如果你想避免循环。

//this section is download  user image data from the db
@RequestMapping(value={"/downloadRow-{img_id}"} , method=RequestMethod.GET)
public void downloadImageFile(@PathVariable int img_id,HttpServletResponse response ,HttpServletRequest request,ModelMap model) 
throws IOException, ServletRequestBindingException{

    ImageModel imgModel=service.downloadFile(img_id);   
    response.setContentType(imgModel.getImageContentTyepe());
    response.setContentLength(imgModel.getImageContentTyepe().length());
    response.setHeader("Content-Disposition","attachment; filename=\""+imgModel.getImg_name()+"\" ");
    FileCopyUtils.copy(imgModel.getImageConent(), response.getOutputStream());              //qustn
    response.getOutputStream().close();
    showRecord(model) ;

}

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

答案 1 :(得分:11)

我认为没有更有效的方法。堆栈是一种定义良好的数据类型,专门设计用于在LIFO环境中运行,并不意味着立即清空。 为此,您可以使用vectordeque(或list),它们基本上是基础容器; stack实际上是一个容器适配器。有关详细信息,请参阅此C++ Reference

如果你没有选择,而且你必须使用堆栈,那么你的方式没有任何问题。无论哪种方式,元素都必须在构造时被销毁,无论是分配新的空堆栈还是弹出所有元素或者其他什么。

我建议改用vector;它确实有您需要的操作:

  • 尺寸(或调整大小)
  • 的push_back
  • pop_back
  • 明确

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

答案 2 :(得分:0)

给它分配一个新的空栈怎么样?

pages = stack<string>();

它不会一个一个地删除元素,它使用移动赋值,所以它有可能非常快。

答案 3 :(得分:-3)

将std :: stack子类化并实现一个简单的clear()方法(访问基础容器c)怎么样?

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