2012-05-18 13 views
8

Duplicar posibles:
Sort list using stl sort function
why only std::list::sort()?clasificación std :: listas usando std :: sort

Mi pregunta es si podemos ordenar dos std :: listas utilizando std :: sort ¿función? Tengo 2 listas de cadenas

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

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

mientras selecciono estas listas recibo un error. He intentado con std :: vector, en este momento el género funciona.

El error es como

C: \ Archivos de programa (x86) \ Microsoft Visual Studio 10.0 \ VC \ include \ xutility (1158): ver la declaración de 'std :: operador -' 1 > C: \ Archivos de programa (x86) \ Microsoft Visual Studio 10.0 \ VC \ include \ algorithm (3642): error C2784: '_Base1 :: difference_type std :: operator - (const std :: _ Revranit < _RanIt, _Base> &, const std :: _ Revranit < _RanIt2, _Base2> &) ': no se pudo deducir el argumento de plantilla para' const std :: _ Revranit < _RanIt, _Base> & ' de 'std :: _ List_iterator < _Mylist>' 1> con 1> [ 1> _Mylist = std :: _ List_val> 1>]

Tengo que saber que solo std :: sort admite listas?

+0

sobrecarga del operador Martol1ni

+0

posible duplicado de [por qué solo std :: list :: sort()?] (Http://stackoverflow.com/questions/7996116/why-only-stdlistsort) y [Ordenar lista usando stl sort function] (http://stackoverflow.com/questions/2432857/sort-list-using-stl-sort-function) –

+0

@ Martol1ni: Es 'std :: string'. 'operator <' está definido, pero no ayudará. –

Respuesta

37

No se puede utilizar para ordenar std::sortstd::list, ya std::sort requiere que los iteradores sean de acceso aleatorio, y los iteradores std::list son solo bidireccionales.

Sin embargo, std::list tiene una función miembro sort que ordenarla:

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

Debe usar list::sort, que puede usar un algoritmo diferente. std::sort requiere iteradores de acceso aleatorio (soportan saltos de tamaño arbitrario) mientras que los iteradores de lista solo pueden avanzar o retroceder un enlace a la vez.

Ver C++ 11 25.4.1.1:

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

y 23.3.5.5/27 (miembros de std::list):

void sort(); 
template <class Compare> void sort(Compare comp); 
Cuestiones relacionadas