¿Cuál es la diferencia entre list.sort y std :: sort?

Estoy tratando de comstackr el siguiente código usando clang pero obtuve el siguiente error.

Me pregunto por qué usar la sort de la clase de list funcionaría, pero no std::sort .

 #include  #include  int main(){ std::string strings[] = {"hello", "nihao", "byebye", "yo"}; std::list cars(strings, strings+sizeof(strings) / sizeof(char **)); // cars.sort(std::less()); // compiles fine and produce a sorted list std::sort(cars.rbegin(), cars.rend(), std::less() ); // this one won't compile for (std::list::iterator it = cars.begin(); it != cars.end(); ++it) std::cout << *it << " - "; std::cout << std::endl; return 0; } 

/usr/include/c++/4.2.1/bits/stl_iterator.h:320:25: error: operandos no válidos para expresiones binarias (‘iterator_type’ (también conocido como ‘std :: _ List_iterator>’) y ‘iterator_type’) {return __y .base () – __x.base (); }

std::sort requiere iteradores de acceso aleatorio , que std::list no proporciona. En consecuencia, std::list y std::forward_list implementan sus propias funciones miembro para la clasificación que funciona con sus iteradores más débiles. Las garantías de complejidad de esas funciones miembro son peores que las del algoritmo general más eficiente. [Whoops: ver comentarios.]

Además, las funciones miembro pueden aprovechar la naturaleza especial de la estructura de datos de la lista simplemente volviendo a vincular los nodos de la lista, mientras que el algoritmo estándar tiene que realizar algo como swap (o algo a ese efecto), que requiere la construcción, asignación y eliminación de objetos. .

Tenga en cuenta que remove() es un caso similar: el algoritmo estándar es simplemente una reorganización de retorno de iterador, mientras que la función miembro de la list realiza la búsqueda y la eliminación real de una sola vez; de nuevo gracias a poder aprovechar el conocimiento de la estructura interna de la lista.