web-dev-qa-db-fra.com

Comparaison de file d'attente prioritaire

J'essaie de déclarer une file d'attente prioritaire dans c ++ à l'aide d'une fonction de comparaison personnalisée ...

Donc, je déclare la file d'attente comme suit:

std::priority_queue<int,std::vector<int>, compare> pq;

et voici la fonction de comparaison:

bool compare(int a, int b)
{
   return (a<b);
}

Je suis à peu près sûr que je l'avais déjà fait auparavant, sans classe, de la même manière, mais maintenant, ce code ne compile pas et j'ai plusieurs erreurs comme celle-ci:

type/value mismatch at argument 3 in template parameter list for 'template<class _Tp, class _Sequence, class _Compare> class std::priority_queue'

Existe-t-il un moyen de créer une fonction de comparaison similaire à celle-ci sans utiliser de classe?

Merci

17
user2455103

Le paramètre template devrait être le type de la fonction de comparaison. La fonction est alors soit construite par défaut, soit vous passez une fonction dans le constructeur de priority_queue. Alors essayez soit

std::priority_queue<int, std::vector<int>, decltype(&compare)> pq(&compare);

ou n'utilisez pas de pointeurs de fonction mais un foncteur de la bibliothèque standard qui peut alors être construit par défaut, éliminant ainsi la nécessité de passer une instance dans le constructeur:

std::priority_queue<int, std::vector<int>, std::less<int> > pq;

http://ideone.com/KDOkJf

Si votre fonction de comparaison ne peut pas être exprimée à l'aide de foncteurs de bibliothèque standard (si vous utilisez des classes personnalisées dans la file d'attente prioritaire), je vous recommande d'écrire une classe de foncteur personnalisée, ou d'utiliser un lambda .

14
leemes

Vous pouvez utiliser C++ 11 lambda function. Vous devez créer un objet lambda, le transmettre au modèle à l'aide de decltype et le transmettre également au constructeur. Cela ressemble à ceci:

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

vous devez spécifier le type de fonction et instancier la fonction dans le constructeur 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
4pie0

Vous pouvez utiliser un typedef. Cela compile très bien:

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
Emil Condrea
std::priority_queue<int, std::vector<int>, bool (*)compare(int, int)> pq(compare);

Est-ce une autre façon pas mentionné.

2
brack

Cela a parfaitement fonctionné pour moi.

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
tushar pahuja