Сравнение приоритетных очередей
Я пытаюсь объявить очередь приоритетов в С++, используя пользовательскую функцию сравнения...
Итак, я объявляю очередь следующим образом:
std::priority_queue<int,std::vector<int>, compare> pq;
и здесь функция сравнения:
bool compare(int a, int b)
{
return (a<b);
}
Я уверен, что сделал это раньше, без класса, аналогичным образом, но теперь этот код не компилируется, и я получаю несколько таких ошибок:
type/value mismatch at argument 3 in template parameter list for 'template<class _Tp, class _Sequence, class _Compare> class std::priority_queue'
Есть ли способ создать функцию сравнения, аналогичную этому, но без использования класса?
Спасибо
Ответы
Ответ 1
Параметром шаблона должен быть тип функции сравнения. Затем функция создается либо по умолчанию, либо передается функция в конструкторе priority_queue
. Поэтому попробуйте либо
std::priority_queue<int, std::vector<int>, decltype(&compare)> pq(&compare);
или не использовать указатели на функции, а вместо этого функтор из стандартной библиотеки, который затем может быть сконфигурирован по умолчанию, исключая необходимость передачи экземпляра в конструкторе:
std::priority_queue<int, std::vector<int>, std::less<int> > pq;
http://ideone.com/KDOkJf
Если ваша функция сравнения не может быть выражена с использованием стандартных библиотечных функторов (если вы используете пользовательские классы в очереди приоритетов), я рекомендую написать пользовательский класс функтора или использовать лямбда.
Ответ 2
Вы можете использовать С++ 11 lambda. Вам нужно создать лямбда-объект, передать его в шаблон с помощью decltype
, а также передать его конструктору. Это выглядит так:
auto comp = [] (int &a, int &b) -> bool { return a < b; };
std::priority_queue<int,std::vector<int>, decltype(comp) > pq (comp);
Ответ 3
вам нужно указать тип функции и создать экземпляр функции в конструкторе priority_queue
.
#include <functional>
bool compare(int a, int b)
{
return (a<b);
}
std::priority_queue<int, std::vector<int>,
std::function<bool(int, int)>> pq(compare);
Ответ 4
Вы можете использовать typedef. Это очень хорошо компилируется:
typedef bool (*comp)(int,int);
bool compare(int a, int b)
{
return (a<b);
}
int main()
{
std::priority_queue<int,std::vector<int>, comp> pq(compare);
return 0;
}
Ответ 5
std::priority_queue<int, std::vector<int>, bool (*)compare(int, int)> pq(compare);
Другой способ не упоминается.
Ответ 6
Это отлично сработало для меня.
struct compare{
bool operator() (const int& p1,const int& p2 ){
return p1<p2;
}
};
int main(){
priority_queue<int,vector<int>, compare > qu;
return 0;
}