Сравнение приоритетных очередей

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

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

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;
}