Будет ли std :: queue front выводить передний элемент из строки? - PullRequest
4 голосов
/ 09 ноября 2010

Будет ли std::queue::front убирать передний элемент из линии?А если нет, то как его удалить?

Ответы [ 3 ]

9 голосов
/ 09 ноября 2010

Существует функция для получения элемента, другая для его удаления:

typedef queue<MyClass> MyQueue;
MyQueue q;
q.push(MyClass(42));
// ...
MyClass const& rx = q.front();
rx.print();

MyClass x = q.front(); // Copies the front element to a fresh object
q.pop(); // From this point, rx is a dangling reference
assert(x == MyClass(42));

Обоснование: если бы была только одна функция pop, которая возвращает передний элемент, было бы невозможнополучить ссылку на передний элемент, так как он был бы удален из очереди.Если вы просто хотите прочитать огромный элемент перед его сбросом, вы, безусловно, не хотите, чтобы ваш код выполнял копирование.

РЕДАКТИРОВАТЬ: Еще одна фундаментальная причина заключается в том, что наличие двух функций означает, что пользователь несет ответственность заделая копию.Предположим, что есть только одна pop функция: что произойдет, если конструктор копирования (внутри pop) сгенерирует исключение?(см. комментарий Стива Джессопа)

2 голосов
/ 09 ноября 2010

Тип определения передней операции для очереди.

value_type& queue::front ()
const value_type& queue::front () const

Обе формы возвращают следующий элемент очереди. Вызывающий должен убедиться, что очередь содержит элемент (size ()> 0); в противном случае поведение не определено. Первая форма для непостоянных очередей возвращает ссылку. Таким образом, вы можете изменить следующий элемент, пока он находится в очереди. Вам решать, будет ли это хороший стиль.

Используйте pop, чтобы удалить его. Удаляет следующий элемент из очереди. Следующий элемент - это элемент, который был вставлен первым (перед всеми другими элементами в очереди). Эта функция не имеет возвращаемого значения. Чтобы обработать следующий элемент, вы должны сначала вызвать front ().

2 голосов
/ 09 ноября 2010

Нет, он просто возвращает ссылку на передний элемент.Если вам нужно вынуть элемент, используйте pop().См. std :: queue для получения более подробной информации.

...