为什么std :: queue不支持clear()函数?

时间:2010-10-06 16:14:31

标签: c++ visual-studio-2008 visual-studio-2010

我有这样的要求。对于一个函数,我将输入作为数字流。我的意思是,在每个调用中,函数会继续使用单个数字进行调用。我正在使用队列来存储数字流。只有在满足某些条件时,我才需要处理一组收集的数字。如果条件不满足,我需要抛出队列中的所有元素,然后开始在其中存储新数字。为了清空队列,我找不到clear()方法。所以我循环如下。

while(!q.empty())
    q.pop();

我在

处获得了清除队列的有效算法

How do I clear the std::queue efficiently?

我的问题是:为什么队列不支持clear()函数?

当deque和vector支持clear()方法时,支持队列的技术难度是什么?

或者我的上述用例非常罕见,因此不受支持? 谢谢。

4 个答案:

答案 0 :(得分:26)

除了已经说过的内容之外,可以轻松清除队列:

queue<int> q;
...
q = queue<int>(); // Assign an empty queue

或在C ++ 11中

q = {};

答案 1 :(得分:20)

根据http://www.cplusplus.com/reference/stl/queue/

  

队列实现为容器适配器,它是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问它。

这意味着队列使用已经存在的容器,并且实际上是作为FIFO队列的这个容器的接口。

这意味着队列不应该被清除。如果需要清除队列,这意味着您实际上需要使用不是队列的对象,因此您应该使用实际的基础容器类型,默认情况下是deque。

答案 2 :(得分:3)

queue只是一个底层容器的适配器,默认为deque,功能受限(如此处所述)。如果您想要完整的功能,请使用基础deque而不是queue

答案 3 :(得分:2)

将此添加到我不断增加的'make STL readable'功能列表中:

template <typename T> 
void Clear(std::queue<T>& Queue) 
{
    Queue = std::queue<T>(); // Assign to empty queue
}

这只是sellibitze出色答案的一个包装,但这意味着每次使用这种技术时我都不必添加注释。