Очередь приоритетов 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
используется по умолчанию и просто применяет обычный оператор <
.
Когда кто-то хочет порядок, отличный от определенного <
, он определяет тип, который обеспечивает необходимое сравнение. Как у вас:
struct comp {
bool operator() (const pii &a, const pii &b) {
return a.second > b.second;
}
};
Обратите внимание, как это принимает два pii
и сравнивается с использованием оператора >
; это дает обратный порядок в очереди по умолчанию.
Затем этот тип comp
указывается в качестве третьего параметра шаблона.
Затем, указав третий параметр, с шаблонами, как и с функциями, второй параметр также должен быть указан, даже если мы хотим только то же самое, что и по умолчанию, std::vector<pii>
.
Зачем нужна спецификация базового контейнера? Это шаблон container adaptor
. Идея состоит в том, что семантика приоритетных очередей не обязательно подразумевает лежащий в основе способ хранения данных. Также стандарт предоставляет ряд структур данных, специально предназначенных для хранения. Поэтому, почему бы Priority_queue не разрешить выбор базового хранилища? Это концепция адаптера.
person
Keith
schedule
03.01.2014