我有这样的要求。对于一个函数,我将输入作为数字流。我的意思是,在每个调用中,函数会继续使用单个数字进行调用。我正在使用队列来存储数字流。只有在满足某些条件时,我才需要处理一组收集的数字。如果条件不满足,我需要抛出队列中的所有元素,然后开始在其中存储新数字。为了清空队列,我找不到clear()方法。所以我循环如下。
while(!q.empty())
q.pop();
我在
处获得了清除队列的有效算法How do I clear the std::queue efficiently?
我的问题是:为什么队列不支持clear()函数?
当deque和vector支持clear()方法时,支持队列的技术难度是什么?
或者我的上述用例非常罕见,因此不受支持? 谢谢。
答案 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出色答案的一个包装,但这意味着每次使用这种技术时我都不必添加注释。