2010-03-12 8 views
19

Ich versuche, eine Liste (Teil einer Klasse) zu sortieren in absteigender Reihenfolge Artikel eines struct enthält, aber es lässt sich nicht kompilieren:Liste sortieren mit STL Sortierfunktion

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

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

Und hier ist SortDescending:

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

Kann mir jemand sagen, was falsch ist?

+0

@Glen siehe http://StackOverflow.com/Questions/2425452/Polynomial-Operations-using-Operator-Overloading – Vlad

Antwort

33

Der Standard-Algorithmus std::sort erfordert Random Access-Iteratoren, die std::list<>::iterator s nicht (Liste Iteratoren sind bidirektionale Iteratoren).

Sie sollten die Elementfunktion verwenden.

+0

aber ich weiß nicht, wie man richtig weniger Betreiber für meine Klasse – Vlad

+2

@Vlad überladen, müssen Sie nichts überladen. 'Result.poly.sort (SortDescending());' sollte gut funktionieren. – Glen

+1

Der 'operator()' in Ihrem Vergleicher sollte * noch * als 'const' gekennzeichnet sein, da er keine Mitglieder verändert. –

10

std::list hat einen eingebauten in sort Methode, die Sie verwenden müssen, da std::sort nur mit zufälligen Access-Iteratoren arbeitet, während std::list::iterator lediglich auf die bidirektionalen Iterator-Klasse von Iteratoren gehört.

Result.poly.sort(SortDescending()); 

Auch Ihre operator() sollte const markiert werden.

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

Schließlich brauchen Sie nicht Ihre eigene comparer dafür zu schreiben, einfach std::greater<T> verwenden (im Standard-Header befindet <functional>):

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

Nein das ist es nicht, es gibt nichts in der Norm, die besagt, dass dies const sein muss. Wenn Sie sich die Fehlermeldung ansehen, scheint 'operator -' für die Eingabe-Iteratoren zu fehlen. –

+0

Es würde eine bessere Antwort geben, wenn es neu bestellt wurde (Const-ness ist ein Side-Issue hier). – visitor

+0

funktioniert immer noch nicht entweder mit meinem eigenen Vergleicher oder mit größer() gibt es immer noch eine Reihe von Fehlern – Vlad

4

Es scheint, wie die Iteratortypen für Result.poly ist fehlt operator -. std::sort nicht mit std::list Änderung arbeiten Result.poly.sort

+0

, aber ich weiß nicht, wie man den weniger Operator für meine Klasse – Vlad

+0

@Vlad korrekt überladen kann man dies durch 'Result.poly.sort (SortDescending())' nennen, keine Notwendigkeit für 'Operator <'. –

+0

@Konrad Ich denke, er sprach über 'Operator <' und hatte die Tatsache verpasst, dass es eine Version von 'std :: ist :: sort' gibt, die ein Prädikat nimmt. –

Verwandte Themen