我有一个名为pages的c ++堆栈。 由于我没有clear()函数来清除堆栈,我编写了以下代码:
stack<string> pages;
//here is some operation
//now clearing the stack
while(!pages.empty())
pages.pop();
现在我的问题是:有更好的方法来清除堆栈吗? 提前致谢。
答案 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环境中运行,并不意味着立即清空。
为此,您可以使用vector
或deque
(或list
),它们基本上是基础容器; stack
实际上是一个容器适配器。有关详细信息,请参阅此C++ Reference。
如果你没有选择,而且你必须使用堆栈,那么你的方式没有任何问题。无论哪种方式,元素都必须在构造时被销毁,无论是分配新的空堆栈还是弹出所有元素或者其他什么。
我建议改用vector
;它确实有您需要的操作:
它更方便,因此您可以使用clear
方法。不确定使用vector
是否真的更高效;堆栈操作基本相同。
答案 2 :(得分:0)
给它分配一个新的空栈怎么样?
pages = stack<string>();
它不会一个一个地删除元素,它使用移动赋值,所以它有可能非常快。
答案 3 :(得分:-3)
将std :: stack子类化并实现一个简单的clear()方法(访问基础容器c)怎么样?
public:
void clear() { c.clear(); }