2010-03-12 13 views
19

Sto cercando di ordinare un elenco (parte di una classe) in ordine contenente elementi di un struct decrescente, ma non viene compilato:Ordina lista delle funzioni utilizzando STL sorta

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

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

E ecco SortDescending:

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

qualcuno può dirmi che cosa c'è che non va?

+0

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

risposta

33

L'algoritmo standard std::sort richiede iteratori ad accesso casuale, che std::list<>::iterator s non sono (elenco iteratori sono iteratori bidirezionali).

È necessario utilizzare la funzione membro std::list<>::sort.

+0

ma non so come sovraccaricare correttamente l'operatore meno per la mia classe – Vlad

+2

@Vlad, non è necessario sovraccaricare nulla. 'Result.poly.sort (SortDescending());' dovrebbe funzionare bene. – Glen

+1

L'operatore '()' nel tuo comparatore dovrebbe * ancora * essere contrassegnato come 'const' in quanto non modifica alcun membro. –

10

std::list ha un built-in sort metodo che è necessario utilizzare dal std::sort funziona solo con iteratori ad accesso casuale, mentre std::list::iterator appartiene solo alla classe iteratore bidirezionale di iteratori.

Result.poly.sort(SortDescending()); 

Inoltre, il operator() dovrebbe essere contrassegnato const.

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

Infine, non è necessario scrivere il proprio operatore di confronto per questo, è sufficiente utilizzare std::greater<T> (che si trova nella intestazione standard <functional>):

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

No, non è così, non c'è nulla nello standard che dice che questo deve essere const. Se si guarda il messaggio di errore, sembra che 'operator -' non sia presente per gli iteratori di input. –

+0

Sarebbe una risposta migliore se fosse riordinato (la costanza è un problema secondario qui). – visitor

+0

continua a non funzionare neanche con il mio comparatore o usando greater() ma dà ancora un mucchio di errori – Vlad

4

Sembra che i tipi di iteratori per Result.poly è mancante operator -. std::sort non funziona con std::list modifica Result.poly.sort

+0

ma non so come sovraccaricare correttamente l'operatore di meno per la mia classe – Vlad

+0

@Vlad è possibile chiamare questo da 'Result.poly.sort (SortDescending())', non c'è bisogno di 'operatore <'. –

+0

@Konrad Penso che stia parlando di 'operator <' e ha perso il fatto che esiste una versione di 'std :: ist :: sort' che prende un predicato. –