2012-05-18 33 views
8

Powiel możliwe:
Sort list using stl sort function
why only std::list::sort()?sortowania std :: list przy użyciu std :: sort

Moje pytanie brzmi, możemy sortować dwa std :: list używając std :: sort funkcjonować? Mam 2 listy ciągów znaków:

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

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

podczas sortowania tych list otrzymuję komunikat o błędzie. Próbowałem z std :: vector, w tej chwili sortowanie działa.

Błąd jest jak

C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ include \ xutility (1158): patrz deklaracja 'std :: operator -' 1 > C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ include \ algorithm (3642): błąd C2784: '_Base1 :: difference_type std :: operator - (const std :: _ Revranit < _RanIt, _Base> &, const std :: _ Revranit < _RanIt2, _Base2> &) ": nie można wyprowadzić argumentu szablonu dla" const std :: _ Revranit < _RanIt, _Base> & " z 'std :: _ List_iterator < _Mylist>' 1> z 1> [ 1> _Mylist = std :: _ List_val> 1>]

muszę wiedzieć że tylko std :: sort obsługuje listy?

+0

przeciążać Martol1ni

+0

możliwy duplikat [dlaczego tylko std :: list :: sort()?] (Http://stackoverflow.com/questions/7996116/why-only-stdlistsort) i [Sortuj listę używając funkcji sortowania] (http://stackoverflow.com/questions/2432857/sort-list-using-stl-sort-function) –

+0

@ Martol1ni: To 'std :: string'. 'operator <' jest zdefiniowany, ale to nie pomoże. –

Odpowiedz

37

Nie można używać std::sort uporządkować std::list, ponieważ std::sort wymaga, aby iteratory były losowe, a Iteratory std::list tylko dwukierunkowe.

Jednak std::list posiada funkcję składową sort że będzie go sortowania:

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

Powinieneś użyć list::sort, która może używać innego algorytmu. std::sort wymaga iteratorów z dostępem losowym (obsługujących skoki o dowolnym rozmiarze), podczas gdy iteratory list mogą przesuwać się tylko do przodu lub do tyłu za pomocą jednego łącza naraz.

See C++ 11 25.4.1.1:

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

i 23.3.5.5/27 (członkowie std::list):

void sort(); 
template <class Compare> void sort(Compare comp); 
Powiązane problemy