File D'Attente De Priorité De Comparaison
Je suis en train de déclarer une file d'attente de priorité en c++ en utilisant 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 assez sûr que je l'ai fait avant, sans classe,d'une manière similaire, mais maintenant, ce code ne compile pas et je reçois plusieurs erreurs de ce type :
type/value mismatch at argument 3 in template parameter list for 'template<class _Tp, class _Sequence, class _Compare> class std::priority_queue'
Est-il un moyen de créer une fonction de comparaison semblable à cela, mais sans l'aide d'une classe?
Grâce
Essayez
Merci mais non, &comparer ne fonctionne pas.... La raison pour laquelle je demande, c'est parce que je veux trier les structures, bases sur un seul de leur valeur, de sorte que std::moins de ne pas vraiment travailler....
&compare
. Si cela ne fonctionne pas, vous pouvez également utiliser std::less<int>
. Cela pourrait être le cas que le paramètre de modèle doit être le type de foncteur, pas un foncteur/valeur de la fonction.Merci mais non, &comparer ne fonctionne pas.... La raison pour laquelle je demande, c'est parce que je veux trier les structures, bases sur un seul de leur valeur, de sorte que std::moins de ne pas vraiment travailler....
OriginalL'auteur user2455103 | 2013-12-29
Vous devez vous connecter pour publier un commentaire.
Le paramètre de modèle doit être le type de la fonction de comparaison. La fonction est alors, soit par défaut de construction ou de passer une fonction dans le constructeur de
priority_queue
. Donc, essayez deou de ne pas utiliser des pointeurs de fonction, mais plutôt un foncteur de la bibliothèque standard, qui peuvent être par défaut-construit, en éliminant la nécessité de passer d'une instance dans le constructeur:
http://ideone.com/KDOkJf
Si votre fonction de comparaison ne peut pas être exprimé à l'aide de la bibliothèque standard foncteurs (dans le cas où vous utilisez des classes personnalisées dans la file d'attente de priorité), je recommande la rédaction d'un personnalisé foncteur de classe, ou utiliser une lambda.
Êtes-vous à l'aide de C++11?
En fait, je ne suis pas sûr... j'utilise codeblocks 12.11 et le compilateur installé avec elle...
Si pas, essayez de ceci
Mais elle a le désavantage que si vous modifiez la signature de
compare
, vous devez également modifierCompareType
en conséquence. Le code des autres fait usage dedecltype
qui permettra d'obtenir le type de ce qui est dans()
, mais il n'est disponible que depuis C++11.OriginalL'auteur leemes
Vous pouvez utiliser C++11 lambda fonction. Vous devez créer lambda objet, de le passer au modèle à l'aide de
decltype
et aussi passer au constructeur. Il ressemble à ceci:C'est la valeur par défaut du conteneur sous-jacent.
OriginalL'auteur Jaa-c
vous devez spécifier le type de fonction et l'instanciation de la fonction dans
priority_queue
constructeur.OriginalL'auteur 4pie0
Vous pouvez utiliser un typedef. Cette compile très bien:
Ahh merci, cette compile parfaitement, mais je n'ai toujours pas comprendre comment cela fonctionne, et la façon dont je pourrais ajouter à mon habitude comparaison avec elle... Ce serait bien si vous éclairci un peu! Merci!
vous avez raison, j'ai oublié d'ajouter la fonction en tant que paramètre de constructeur
oui c'est ce que je pense aussi...
j'ai mis à jour ma réponse , ne pas oublier ce moment pour passer à la fonction de comparaison pour le constructeur.
OriginalL'auteur Emil Condrea
Est une autre façon de ne pas mentionnés.
OriginalL'auteur brack
Cela a fonctionné parfaitement pour moi.
OriginalL'auteur tushar pahuja