cómo agregar un objeto list <T> a otro

92

en C ++, tengo dos list<T>objetos Ay Bquiero agregar todos los miembros de Bal final de A. He buscado en algunas fuentes diferentes y no he encontrado una solución simple (ei A.append(B);) y esto me sorprende un poco.

¿Cuál es la mejor manera de hacer esto?

Da la casualidad de que B no me importa después de esto (se elimina en la siguiente línea), así que si hay una manera de aprovechar eso para un mejor rendimiento, también me interesa eso.

BCS
fuente

Respuestas:

193

Si desea adjuntar copias de los elementos de B, puede hacer lo siguiente:

a.insert(a.end(), b.begin(), b.end());

Si desea mover elementos de B al final de A (vaciando B al mismo tiempo), puede hacer:

a.splice(a.end(), b);

En su situación, el empalme sería mejor, ya que solo implica ajustar un par de punteros en las listas vinculadas.

UncleBens
fuente
8
+1. Muy bien. Si pudiera haber sido tan fácil y eficiente "cortar" mapas y conjuntos ...
paercebal
¿Alguna de estas operaciones es O (1)?
Chris Redford
2
Supongo que el empalme debería ser O (1) para el caso anterior.
chunkyguy
9
Es O (1) para a.splice(a.end(), b)y a.splice(a.end(), b, it_b_start), pero es O (n) para a.splice(a.end(), b, it_b_start, it_b_end).
hkBattousai
9
¿Por qué, o por qué, STL no podría simplemente admitir a.append (b)?
Salida el
-3

un ejemplo usando boost

std::list<T> A; // object A is a list containing T structure
std::list<T> B; // object B is a list containing T structure

// append list B to list A
BOOST_FOREACH(auto &listElement, B) { A.push_back( listElement ); }
serup
fuente