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

bjs*_*123 26 c++ visual-studio-2010 visual-studio-2008

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

while(!q.empty())
    q.pop();
Run Code Online (Sandbox Code Playgroud)

我得到了有效的清算队列算法

如何有效清除std :: queue?

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

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

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

sel*_*tze 26

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

queue<int> q;
...
q = queue<int>(); // Assign an empty queue
Run Code Online (Sandbox Code Playgroud)

或者在C++ 11中

q = {};
Run Code Online (Sandbox Code Playgroud)

  • 虽然,使用gcc 4.9.1`q = {}`给出了从初始化列表转换为std :: queue <...>的错误,将使用显式构造函数`. (6认同)

Sir*_*ius 21

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

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

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

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

  • 所以我猜`std :: queue`是一个受损的队列,意味着非常有限的用途,是消息吗? (3认同)

Ste*_*end 5

queue只是一些底层容器的适配器,默认情况下 a deque,具有受限功能(如您在此处所述)。如果您想要完整的功能,请使用底层deque而不是queue.