Почему std :: queue не имеет оператора []? - PullRequest
3 голосов
/ 31 августа 2011

std::queue реализован с deque по умолчанию.std::deque имеет оператор индекса operator[] и, вероятно, реализован с массивами.Так почему же std::queue не имеет operator[]?

Я понимаю, что у вас может быть очередь со списком в качестве основного контейнера.(std::queue<int, std::list<int>>.) Но даже если это приведет к замедлению работы индекса, это действительно хорошая причина не включать его?Это единственная причина, по которой я могу думать, что она не включена.

Ответы [ 4 ]

8 голосов
/ 31 августа 2011

Поскольку определение очереди не поддерживает такой интерфейс.Очередь - это структура данных FIFO, что означает «первым пришел - первым вышел».Очередь поддерживает операции enqueue и dequeue .

Представьте себе очередь как канал: вы вставляете данные в один конец, а с другого - вынимаете их - один за другим,Вставка данных называется enqueue, а извлечение их называется dequeue.Стандартная библиотека C ++ имеет std::queue, которая определяет обе эти операции: push() - это имя операции постановки в очередь, а операция удаления разбита на два этапа, а именно front(), за которыми следует pop().Объяснение того, почему dequeue был разделен на два этапа, состоит в том, чтобы дать строгую гарантию исключения 1 .

Википедия объясняет это кратко,

Очередь - это особый вид коллекции, в которой объекты в коллекции поддерживаются в порядке, а основные (или единственные) операции над коллекцией - это добавление объектов к заднему положению терминала и удаление объектов.из положения переднего терминала.Это делает очередь структурой данных «первым пришел - первым обслужен» (FIFO). В структуре данных FIFO первый элемент, добавленный в очередь, будет первым, который будет удален. Это эквивалентно требованию, что после добавления элемента все элементы, которые были добавлены ранее, должны бытьудаляется до того, как новый элемент может быть вызван.Очередь является примером линейной структуры данных.

1.Если вы хотите знать, насколько точно это дает надежную гарантию исключений, тогда вы можете начать другую тему, потому что это очень длинная история, и для ее правильного понимания требуется много терпения.Я бы посоветовал вам прочитать «Исключительный С ++» Херба Саттера для этого.

4 голосов
/ 31 августа 2011

Это вопрос концепции. В очереди вы добавляете сзади и берете с фронта, а не с середины

3 голосов
/ 31 августа 2011

Причина не включать его, потому что очередь - это структура данных с операциями постановки и удаления, а не произвольного доступа. std::queue существует для адаптации существующего контейнера к интерфейсу очереди, поэтому он предоставляет только интерфейс очереди.

0 голосов
/ 06 февраля 2015

Если вы хотите использовать [], тогда используйте deque с push_front и back / pop_back, а не очередью.

Почему в двусторонней очереди она есть, а не в очереди, мне тоже не имеет смысла.

...