std::priority_queue
не дает никакого доступа к элементам, кроме верхнего, и не допускает внешнего доступа к нижележащему контейнеру.Поэтому, если вам нужна очередь с повторяющимися приоритетами, вы должны что-то написать самостоятельно.Вы можете создать что-то вроде этого:
template <class T, class Container = std::vector<T>, class Compare = std::less<typename Container::value_type>>
class IterableQueue : public std::priority_queue<T, Container, Compare>
{
public:
using std::priority_queue<T, Container, Compare>::priority_queue;
const Container& container() const { return this->c; }
};
Обратите внимание, что вообще плохая идея публично наследовать от контейнеров стандартной библиотеки (как в моем примере выше), потому что у них нет виртуальных деструкторов и, следовательно,разрешить преобразование в базовый контейнер потенциально опасно.
В рабочем коде было бы лучше использовать частное наследование и публиковать (посредством using
объявлений) элементы, которые вы хотите получить доступными (по сути, только все из них).
Также имейте в виду, что предоставление внешнему миру не-const
доступа к нижележащему контейнеру было бы довольно плохой идеей, поскольку это могло бы нарушить инварианты очереди приоритетов и привести к неопределенному поведению.