2008-10-19 7 views
7

Tengo una lista enlazada que quiero para ordenar parte de, por ejemplo:especie parcial de std :: lista

std::sort(someIterator, otherIterator, predicate); 

std :: sort requiere iteradores de acceso aleatorio por lo que este enfoque no funciona. Hay una especialización std :: list :: sort, pero que solo puede ordenar toda la lista. No creo que tenga suficiente acceso a los miembros de la lista para escribir algo yo mismo.

¿Hay alguna manera de hacerlo sin cambiar, por ejemplo, a vector?

+0

y ¿cuál es la razón principal por la que está utilizando list en lugar de vector? A pesar del hecho de que std :: vector tiene que realizar movimiento en avg. medio elemento (por ejemplo, al eliminar), es súper rápido gracias a la memoria caché. std :: vector beats std :: list incluso en frecuentes eliminaciones e inserciones en rand. pos. Tienes que tener una gran cantidad de elementos para obtener ganancias usando la lista. – relaxxx

+0

Bueno, sinceramente, no lo recuerdo, ya que en los tres años y medio transcurridos desde que pregunté estoy bastante seguro de que fue rediseñado de alguna manera y hace mucho tiempo que dejé ese trabajo. El objetivo de la pregunta no era tanto acerca de la eficiencia (aunque hay una buena probabilidad de que hubiera suficientes datos que no hubiera querido duplicar todo sobre la marcha) sino más bien de curiosidad; parecía extraño que no pareciera poder hacer este tipo parcial y que debería haber alguna manera de lograrlo. – Peter

+0

oh: D mi mal ... Me encontré con esta pregunta a través de la búsqueda no a través de "páginas de preguntas activas" y no me di cuenta de que :) En realidad pensé que esta es una pregunta activa. – relaxxx

Respuesta

12

¿Qué tal si desenganchamos la parte de la lista que queremos ordenar en una lista independiente, , usamos la lista de clasificación especializada y luego la enganchamos nuevamente a la lista original?

+2

Esa es una buena idea. Es fácil olvidar el poder del método splice(). – bk1e

+0

+1 Esa es la forma más fácil de hacerlo. – Nawaz

Cuestiones relacionadas