почему std :: queue не поддерживает функцию clear ()? - PullRequest
25 голосов
/ 06 октября 2010

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

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

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

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

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

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

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

Ответы [ 4 ]

26 голосов
/ 06 октября 2010

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

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

или в C ++ 11

q = {};
20 голосов
/ 06 октября 2010

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

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

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

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

3 голосов
/ 06 октября 2010

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

2 голосов
/ 23 февраля 2016

Добавил это в мой растущий список функций «сделать STL читабельным»:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...