2012-05-18 19 views
8

Eventuali duplicati:
Sort list using stl sort function
why only std::list::sort()?l'ordinamento std :: list utilizzando std :: sort

La mia domanda è: possiamo ordinare due std :: liste usando std :: sorta funzione? Ho 2 elenchi di stringhe

std::list<std::string>list1, list2; 
    .....//entering values to list 
    std::sort(list1.begin(), list1.end()); 

    std::sort(list2.begin(), list2.end()); 

mentre sto smistando queste liste sto ricevendo errore. Ho provato con std :: vector, in questo momento l'ordinamento funziona.

L'errore è come

C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ include \ xutility (1158): vedere la dichiarazione di 'std :: operator -' 1 > C: \ Programmi (x86) \ Microsoft Visual Studio 10.0 \ VC \ include \ algorithm (3642): errore C2784: '_Base1 :: difference_type std :: operator - (const std :: _ Revranit < _RanIt, _Base> &, const std :: _ Revranit < _RanIt2, _Base2> &) ': non può dedurre argomento modello per' const std :: _ Revranit < _RanIt, _Base> & ' da 'std :: _ List_iterator < _Mylist>' 1> con 1> [ 1> _Mylist = std :: _ List_val> 1>]

devo sapere che solo std :: sort supporta le liste?

+0

sovraccarico l'operatore Martol1ni

+0

possibile duplicato di [perché solo std :: list :: sort()?] (Http://stackoverflow.com/questions/7996116/why-only-stdlistsort) e [Ordina elenco utilizzando la funzione stl sort] (http://stackoverflow.com/questions/2432857/sort-list-using-stl-sort-function) –

+0

@ Martol1ni: È 'std :: string'. 'operator <' è definito, ma non sarà di aiuto. –

risposta

37

Non è possibile utilizzare std::sort per ordinare std::list perché std::sort richiede agli iteratori l'accesso casuale e gli iteratori std::list sono bidirezionali.

Tuttavia, std::list ha una funzione membro sort che ordinare esso:

list.sort(); 
// if you want to use a comparator different from the default one: 
// list.sort(comparator); 
7

È necessario utilizzare list::sort, che può utilizzare un algoritmo diverso. std::sort richiede iteratori ad accesso casuale (che supportano salti di dimensioni arbitrarie) mentre gli iteratori di elenchi possono solo andare avanti o indietro di un collegamento alla volta.

See C++ 11 25.4.1.1:

template<class RandomAccessIterator> void sort(RandomAccessIterator first, 
     RandomAccessIterator last); 

e 23.3.5.5/27 (membri del std::list):

void sort(); 
template <class Compare> void sort(Compare comp); 
Problemi correlati