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.
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()' –