Как работает очередь приоритетов? Я начал изучать алгоритм Дейкстры, искал его и получил много кода, где разные кодеры использовали разные версии очередей приоритетов. В одном коде я заметил, что он использует это выражение
priority_queue <pii, vector <pii>, comp> Q;
//pii means pair <int,int>
// And comp is compare structure which I also cannot understand
Comp выглядит следующим образом
struct comp {
bool operator() (const pii &a, const pii &b) {
return a.second > b.second;
}
};
Может ли кто-нибудь объяснить мне, что здесь происходит? Также сколько версий объявлений priority_queue
есть в c++?
C++ приоритетная очередь:
template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> > class priority_queue;
В этом:
T
- тип, который должен храниться в очереди; надеюсь, это достаточно ясно.
Container
является основным хранилищем в очереди. Как видно из объявления, это значение по умолчанию соответствует std::vector<T>
, и обычно его можно игнорировать.
Compare' is the method for determining the ordering in the queue. Again, it has a default and can often be ignored.
Compare '- это тип, поддерживающий вызов функции, который может сравнивать два элемента в очереди и определять их порядок.
less
является значением по умолчанию и просто применяет обычный <
operator.
Когда требуется упорядочение, отличное от того, которое определено <
, один определяет тип, который обеспечивает необходимое сравнение. Поскольку у вас есть:
struct comp {
bool operator() (const pii &a, const pii &b) {
return a.second > b.second;
}
};
Обратите внимание, как это занимает два pii
и сравнивается с помощью оператора >
; это дает обратное порядку по умолчанию в очереди.
Этот тип comp
затем указывается в качестве третьего параметра в шаблоне.
Указав третий параметр, тогда с шаблонами, как и с функциями, необходимо указать второй параметр, хотя мы хотим только то же, что и по умолчанию, std::vector<pii>
.
Почему спецификация базового контейнера? Это шаблон container adaptor
. Идея состоит в том, что семантика очередей приоритетов не обязательно подразумевает основной способ хранения данных. Также стандарт предоставляет число, если структуры данных специально ориентированы на хранение. Поэтому почему бы не иметь priority_queue, позволяющий выбрать базовое хранилище? Это концепция адаптера.
Если вы прочитаете ссылку для priority_queue, вы увидите, что первым аргументом является тип, а второй аргумент - контейнер, а третий - класс сравнения. Кроме того, насколько я знаю, в стандарте C++ есть только одна очередь приоритетов, я реализовал собственную собственную очередь, используя двоичное дерево поиска, которое является очень полезным упражнением, которое я рекомендую.
В примере алгоритма Дейкстры в блоге zobayer это все немного запутано из-за использования макросов в коде. Это позор, что этот код настолько запутан, что он затрудняет выполнение кода.
Класс comp (struct - это класс со всеми членами public по умолчанию) operator() просто берет второй элемент в паре pii и сравнивает его с другим pii. Вы настроили бы это независимо от того, что ваш тип находится в очереди приоритетов.
а также проверить этот алгоритм dijkstra - в c++?