2010-11-18 14 views
9

¿Cuál es la forma "correcta" de agregar todos los elementos de una lista estándar a otra?Forma simple de agregar elementos de una lista a otra lista

void 
Node::addChilds(const NodeList *list) 
{ 
    for(NodeList::const_iterator i = list->begin(); 
     i != list->end(); 
     ++i) 
     { 
      this->m_childs.push_back(*i); 
     } 
} 

pensé en std :: copia, pero que yo sepa de copia que tenga que cambiar el tamaño de la lista de destinos, copia de seguridad del iterador final (antes del cambio de tamaño), etc.

estoy en busca de una sola línea declaración.

+1

¿Qué es 'NodeList'? ¿Cómo se declara 'm_childs'? –

Respuesta

12

Utilice un back_insert_iterator. Si std::list<T> es el tipo de m_childs,

std::copy(list.begin(), list.end(), 
      std::back_insert_iterator<std::list<T> >(m_childs)); 
+0

tanto esto como @ybungalobill son correctos. Yo prefiero esto sin embargo. He aquí por qué: [http://stackoverflow.com/questions/4152815/stl-use-member-functions-or-functions-in-algorithm/4156380#4156380] –

+3

Hubiera pensado que la función miembro 'list :: insert' ser más eficiente. ¿Alguna idea de si eso es correcto? –

+2

En Linux/x86 ejecutándose en un Intel Core 2 @ 1.86GHz, GCC 4.3.2, llenando una lista con 10000000 elementos, copiar eso en otra lista e imprimir el segundo elemento toma ca. 2.5s de reloj de pared, 2.1s de tiempo de usuario, independientemente de si se usa 'copy' o' insert'. –

13
this->m_childs.insert(this->m_childs.end(), list->begin(), list->end()); 
12

Si los elementos se deben mover, puede utilizar empalme. De lo contrario, cópialos, como lo explican ybungalobill o larsmans.

3

Scott Meyers escribe sobre este tema específico en "Efectivo STL", en el artículo 5 (y menciona splice en el elemento 4). Él prefiere la versión de ybungalobill, pero sobre todo porque cree que el código es más claro y más claro ya que enfatiza la palabra 'insertar' y no la palabra 'copiar'.

Casi todos los usos de std::copy que utilizan un iterador (como back_inserter) pueden reemplazarse por llamadas a funciones de miembros de rango (como .insert(position, begin, end)).

splice es una función miembro constante, por lo que será más rápido si es aplicable en este caso específico.

Cuestiones relacionadas