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.