2010-03-12 5 views
19

Je suis en train de trier une liste (partie d'une classe) dans l'ordre décroissant contenant des éléments d'un struct, mais il ne compile pas:liste Trier en utilisant la fonction de tri STL

error: no match for 'operator-' in '__last - __first'

sort(Result.poly.begin(), Result.poly.end(), SortDescending()); 

Et voici SortDescending:

struct SortDescending 
{ 
    bool operator()(const term& t1, const term& t2) 
    { 
     return t2.pow < t1.pow; 
    } 
}; 

quelqu'un peut-il me dire ce qui ne va pas?

+0

@Glen voir http://stackoverflow.com/questions/2425452/polynomial-operations-using-operator-overloading – Vlad

Répondre

33

L'algorithme standard std::sort nécessite itérateurs d'accès aléatoire, qui std::list<>::iterator s ne sont pas (itérateurs liste sont itérateurs bidirectionnelle). Vous devez utiliser la fonction membre std::list<>::sort.

+0

mais je ne sais pas comment surcharger correctement l'opérateur moins pour ma classe – Vlad

+2

@Vlad, vous n'avez pas besoin de surcharger quoi que ce soit. 'Result.poly.sort (SortDescending());' devrait fonctionner correctement. – Glen

+1

L'opérateur '()' dans votre comparateur doit toujours être marqué 'const' car il ne modifie aucun membre. –

10

std::list a une méthode intégrée sort que vous devez utiliser car std::sort fonctionne uniquement avec itérateurs d'accès aléatoire, alors que std::list::iterator appartient simplement à la classe iterator bidirectionnelle de itérateurs.

Result.poly.sort(SortDescending()); 

En outre, votre operator() devrait être marqué const.

struct SortDescending 
{ 
    bool operator()(const term& t1, const term& t2) const 
    { 
     return t2.pow < t1.pow; 
    } 
}; 

Enfin, vous n'avez pas besoin d'écrire votre propre comparateur pour cela, utilisez simplement std::greater<T> (situé dans l'en-tête standard <functional>):

Result.poly.sort(std::greater<term>()); 
+0

Non, ce n'est pas ça, il n'y a rien dans la norme qui dit que cela doit être const. Si vous regardez le message d'erreur, il semble que 'operator -' est manquant pour les itérateurs d'entrée. –

+0

Il ferait une meilleure réponse s'il était réorganisé (la constance est un problème secondaire ici). – visitor

+0

ne fonctionne toujours pas avec mon propre comparateur ou en utilisant un plus grand() il donne encore un tas d'erreurs – Vlad

4

Il semble que les types de iterator pour Result.poly est manquant operator -. std::sort ne fonctionne pas avec std::list changement Result.poly.sort

+0

mais je ne sais pas comment surcharger correctement l'opérateur moins pour ma classe – Vlad

+0

@Vlad vous pouvez l'appeler par 'Result.poly.sort (SortDescending())', pas besoin de 'operator <'. –

+0

@Konrad Je pense qu'il parlait de 'operator <' et avait manqué le fait qu'il y ait une version de 'std :: ist :: sort' qui prenne un prédicat. –

Questions connexes