29

I have requirement: for a function, I get the input as a stream of numbers. I mean, the function keeps on getting called with single number in each call. I am using std::queue for storing the stream of numbers. I need to process a collected set of numbers only when some condition is satisfied. If the condition is not satisfied I need to put all the elements into the queue and then start storing new numbers in there. For emptying the queue, I couldn't find a clear() method. So I am looping like this:

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

I got an efficient algorithm for clearing a std::queue at

How do I clear the std::queue efficiently?

My question is: Why doesn't std::queue support a clear() function?

Since std::deque and std::vector both support a clear() method, what is the technical difficulty in supporting it for std::queue?

Or is my above use case very rare and hence not supported?

Gordon Brandly
  • 342
  • 4
  • 13
bjskishore123
  • 5,984
  • 9
  • 39
  • 65

4 Answers4

29

Apart from what has been said already, you can clear a queue very easily:

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

or in C++11

q = {};
ravenspoint
  • 16,826
  • 5
  • 55
  • 90
sellibitze
  • 26,764
  • 3
  • 73
  • 92
23

According to http://www.cplusplus.com/reference/stl/queue/,

queues are implemented as containers adaptors, which are classes that use an encapsulated object of a specific container class as its underlying container, providing a specific set of member functions to access it elements.

which means that the queue uses an already existing container, and is just really is an interface to this container as a FIFO queue.

This means queues are not meant to be cleared. If you need to clear a queue, this means you actually need to use an object that is not a queue, and therefore you should instead use the actual underlying container type, being a deque by default.

SirDarius
  • 39,072
  • 8
  • 82
  • 98
  • 4
    So I guess `std::queue` is an impaired queue meant for very limited uses, is the message? – bobobobo May 24 '13 at 00:37
  • The rationale behind the queue adapter is that items that are inserted must be extracted at some point, and not be lost using a multiple-element deletion operation. Does that make sense ? Not necessarily, since it can be cleared anyways... – SirDarius Mar 27 '16 at 19:15
5

queue is just an adapter for some underlying container, by default a deque, with restricted function (as you noted here). If you want the full blown function use the underlying deque instead of queue.

Steve Townsend
  • 52,418
  • 9
  • 90
  • 139
2

Added this to my growing list of 'make STL readable' functions:

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

It's just a wrapper around sellibitze's excellent answer, but means I don't have to also add a comment every time I use the technique.

Andy Krouwel
  • 1,159
  • 9
  • 20