2011-02-06 17 views
24

que ya tiene el puntero lista de CDrawObject *lista Mover elemento al final de STL

std::list<CDrawObject*> elements; 

¿Cómo puedo mover un elemento al final de la lista. Veo STL Algorithms Reference pero no encuentro esta operación. ¿Cómo puedo hacerlo?

+8

No es 100% pertinente con su pregunta, pero ¿está seguro de que una lista vinculada de punteros es una opción de estructura de datos sensata? Solo hay unos pocos casos en los que considero que es la mejor opción ... – 6502

+1

Es cuando lo que está haciendo es mover un elemento desde el medio de la lista hasta el final. lista es la única colección en la que hacer esto es tiempo constante. – CashCow

+0

@CashCow: Ese tiempo, aunque constante, podría ser más largo de lo que se necesita para 'std :: memmove()' el contenido de un 'std :: vector' de contenedores, especialmente cuando aspectos como la localidad de datos (caché de la CPU) es tomado en cuenta. – sbi

Respuesta

45

Utilice el empalme método list()

void list::splice (iterator position, list<T,Allocator>& x, iterator i);

iterador Move i de la lista x en la lista actual en la posición "posición"

Así, para moverlo a la final puso

x.splice(x.end(), x, iter); 

(ambos pueden ser la misma lista o listas diferentes siempre que la lista desde la que se mueve el elemento tenga el mismo tipo, tanto T como el Asignador)

+1

En su ejemplo, ¿qué pasa si 'iter' ya está apuntando al último elemento? ¿Es necesario para un caso especial? –

+0

No debería ser necesario probarlo, y la función de biblioteca aún debería funcionar. No es seguro que sea tan óptimo, ya que la especificación de C++ solo dice cuál debe ser el resultado de una función y no si se debe hacer de la manera más óptima. – CashCow

0

Quítelo y añádalo a su lista.

+2

Esto no es tan eficiente como la respuesta elegida. – Graeme

+0

usando empalme tampoco invalida los iteradores mientras esto lo hace – Sopel

4

Un std::list es una lista doblemente enlazada, lo que significa que no tiene acceso aleatorio a n elemento. Usted tiene que puede eliminar el elemento, y luego usar push_back.

+3

No, no tienes que hacerlo de esa manera y el cartel fue demasiado rápido para aceptar la respuesta. – CashCow

+1

No quise decir "tener que hacerlo" en el sentido de "esa es la única manera", pero de todos modos, @ G-71 no dude en rechazar mi respuesta si otra respuesta es mejor. –

+3

+1 totalmente aceptable para un contenedor de punteros. Sin embargo, si copiar una T es más costoso, se debería preferir el empalme. – sellibitze

Cuestiones relacionadas