Почему std:: queue не поддерживает функцию clear()?

У меня есть требование как это. Для функции я получаю ввод как поток чисел. Я имею в виду, что функция продолжает получать вызовы с одним номером в каждом вызове. Я использую очередь для хранения потока чисел. Мне нужно обработать собранный набор чисел только при выполнении некоторого условия. Если условие не выполняется, мне нужно выбросить все элементы в очереди и затем начать хранить в нем новые числа. Для опорожнения очереди я не смог найти метод clear(). Итак, я петлю, как показано ниже.

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

Я получил эффективный алгоритм для очистки очереди в

Как эффективно очистить очередь std::

Мой вопрос: почему очередь не поддерживает функцию clear()?

Когда deque и vector поддерживают метод clear(), какова техническая сложность в его поддержке для очереди?

Или мой выше usecase очень редок и, следовательно, не поддерживается? Спасибо.

Ответ 1

Согласно http://www.cplusplus.com/reference/stl/queue/,

очереди реализуются как адаптеры контейнеров, которые являются классами, которые используют инкапсулированный объект определенного класса контейнера в качестве своего основного контейнера, предоставляя определенный набор функций-членов для доступа к ним.

что означает, что очередь использует уже существующий контейнер и на самом деле является интерфейсом для этого контейнера в качестве очереди FIFO.

Это означает, что очереди не должны очищаться. Если вам нужно очистить очередь, это означает, что вам действительно нужно использовать объект, который не является очередью, поэтому вместо этого вы должны использовать фактический базовый тип контейнера, по умолчанию являющийся deque.

Ответ 2

Помимо уже сказанного, вы можете легко очистить очередь:

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

или в С++ 11

q = {};

Ответ 3

queue является всего лишь адаптером для некоторого базового контейнера, по умолчанию deque, с ограниченной функцией (как вы отметили здесь). Если вы хотите, чтобы функция полного размытия использовала базовый deque вместо queue.

Ответ 4

Добавил это в свой растущий список "make STL readable":

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

Это просто обертка вокруг sellibitze отличного ответа, но означает, что мне не нужно также добавлять комментарий каждый раз, когда я использую эту технику.