Сравнение приоритетов

Я пытаюсь объявить приоритетную очередь в c ++, используя пользовательскую функцию сравнения …

Итак, я объявляю очередь следующим образом:

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'

Есть ли способ создать функцию сравнения, похожую на эту, но без использования класса?

Спасибо

17

Решение

Параметр шаблона должен быть тип функции сравнения. Затем функция либо создается по умолчанию, либо вы передаете функцию в конструктор 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

Если ваша функция сравнения не может быть выражена с помощью стандартных библиотечных функторов (если вы используете пользовательские классы в очереди приоритетов), я рекомендую написать пользовательский класс функторов, или используйте лямбду.

14

Другие решения

Вы можете использовать C ++ 11 лямбда функция. Вам нужно создать лямбда-объект, передать его в шаблон с помощью decltype а также передать его конструктору. Это выглядит так:

auto comp = [] (int &a, int &b) -> bool { return a < b; };
std::priority_queue<int,std::vector<int>, decltype(comp) > pq (comp);
9

Вы должны указать тип функции и создать экземпляр функции в 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);
6

Вы можете использовать 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;
}
2
std::priority_queue<int, std::vector<int>, bool (*)compare(int, int)> pq(compare);

Другой способ не упоминается.

2

Это отлично сработало для меня.

struct compare{
bool operator() (const int& p1,const int& p2 ){
return p1<p2;
}
};

int main(){
priority_queue<int,vector<int>, compare > qu;
return 0;
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector