Очереди не для итерации. Весь смысл очереди в том, что вы можете только смотреть на элемент в начале очереди.
Если вы хотите повторить, то я предлагаю просто использовать std::set
, который упорядочен. Если вы хотите изменить элемент, вам придется удалить его и заново вставить его с новым ключом. Вы можете получить элемент с наивысшим приоритетом, используя mySet.begin()
(который возвращает итератор).
В идеале, вы захотите использовать кучу. STL предоставляет функции для создания кучи, и это то, что std::priority_queue
использует. Однако вы не можете изменять ключи в куче, потому что нет интерфейса для этого.
Если вы сами управляете кучей, тогда можете. Однако вам необходимо использовать функцию std::__adjust_heap
из <heap.h>
, которая не имеет документов. Вы можете прочитать все о том, почему эта функция недокументирована в этом интервью с Александром Степановым (изобретатель STL). Его пришлось «удалить», потому что очевидно, что STL был слишком большим, что также произошло с хэш-картами из исходного стандарта.