2010-04-09 22 views
37

¿Hay una manera mejor de agregar un conjunto a otro conjunto que iterar a través de cada elemento?agregar conjunto a otro conjunto

tengo:

set<string> foo ; 
set<string> bar ; 

..... 

for (set<string>::const_iterator p = foo.begin();p != foo.end(); ++p) 
    bar.insert(*p); 

¿Hay una manera más eficiente de hacer esto?

Respuesta

67

Puede insertar un rango:

bar.insert(foo.begin(), foo.end()); 
+2

Curiosamente C++ 03 garantiza el tiempo lineal !? como el rango está ordenado (viene de otro 'conjunto '), pero un borrador relativamente reciente de C++ 0x ha eliminado esta garantía. –

7

No es un código más eficiente, pero menos.

bar.insert(foo.begin(), foo.end()); 

O tome la unión que trata eficientemente con duplicados. (si corresponde)

set<string> baz ; 

set_union(foo.begin(), foo.end(), 
     bar.begin(), bar.end(), 
     inserter(baz, baz.begin())); 
+0

No estoy seguro de lo que quiere decir con '... trata de manera eficiente con duplicados'. ¿Cree que 'insert' no es eficiente con duplicados, suficientes para garantizar el uso de un tercer contenedor? –

+0

@Charles: Buena pregunta. Hay casos en los que desearía mantener sus conjuntos y, de todos modos, necesitar un tercer contenedor. Acerca de la eficiencia: Josuttis dice que es lineal (a lo sumo, 2 * (n + m) - 1 comparaciones) –

+1

'set_union' puede ser lineal, pero es probable que el insertador no lo sea. – UncleBens

Cuestiones relacionadas