2012-09-27 13 views
7

Duplicar posibles:
Is there a standard way of moving a range into a vector?C++ 11 inserción movimiento para std :: deque o std :: lista

entiendo bastante bien cómo funciona rvalue referencias, pero estoy no estoy seguro de cómo funcionan con los iteradores en el STL. Aquí hay algo que quiero:

void insertList(std::list<int>& L, std::list<int>&& R, std::list<int>::iterator insertPoint) 
{ 
    L.insert(insertPoint, R.begin(), R.end()); // want to use move semantics 
} 

Ahora sé que std :: list tiene un método de empalme. Pero quiero saber si esto puede funcionar en absoluto. ¿Puede funcionar para deque también?

+3

Votación para volver a abrir. Si bien hay una parte que se comparte con la pregunta marcada como duplicada (moviéndose a un 'deque'), también hay una parte que es muy diferente' list <> 'y para la cual la solución en la pregunta vinculada es peor que la alternativa 'splice()' –

Respuesta

11

El splice y mover los contenidos de los recipientes son diferentes operaciones. En el caso de splice (que no se puede hacer con deque), el nodo completo se transfiere de un contenedor a otro. Los nodos ya no estarán en el contenedor original y la operación no realizará asignaciones.

La alternativa de movimiento el contenido con un algoritmo similar al que se ha dicho, pero usando un movimiento iterador:

L.insert(insertPoint, 
     std::make_move_iterator(R.begin()), 
     std::make_move_iterator(R.end())); 

Esto funciona tanto para list y deque pero la semántica es diferente . La inserción a la nueva lista requerirá la asignación de nodos std::distance(R.begin(),R.end()), cuyo contenido se rellenará moviéndose desde el contenedor original. Eso reduce el costo de la creación de los nuevos nodos, pero deben asignarse de todos modos. Tenga en cuenta que la lista anterior aún contendrá todos los nodos, aunque serán vacíos cuando se haya movido el contenido de los datos.

En el caso de std::list debe preferir , pero eso no está disponible en otros contenedores. En el caso de otros contenedores, se le aplicará el enfoque anterior, donde se debe tomar el costo de construir la estructura de datos del contenedor, aunque se puede evitar el costo de la creación de los datos almacenados.

+0

+1 para dar una explicación adecuada. ; -] – ildjarn

+0

+1 buena explicación sobre los iteradores de movimiento, gracias – Walter

Cuestiones relacionadas