anexar conjunto a otro conjunto

Hay una manera mejor de anexar un conjunto a otro conjunto de la iteración a través de cada elemento ?

tengo :

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

.....

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

Es allí una manera más eficiente de hacer esto ?

InformationsquelleAutor mr.bio | 2010-04-09

2 Kommentare

  1. 92

    Puede insertar un rango:

    bar.insert(foo.begin(), foo.end());
    • Curiosamente C++03 garantiza el tiempo lineal!? como el rango es de ordenadas (viene de otro set), pero relativamente reciente proyecto de C++0x ha eliminado esta garantía.
  2. 10

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

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

    O tomar la unión que se ocupa de manera eficiente con los duplicados. (si es aplicable)

    set<string> baz ;
    
    set_union(foo.begin(), foo.end(),
          bar.begin(), bar.end(),
          inserter(baz, baz.begin()));
    • No estoy seguro de lo que quieres decir con «…trata de manera eficiente con los duplicados’. ¿Crees que insert no es eficiente con los duplicados, suficiente para justificar el uso de un tercer recipiente?
    • Buena pregunta. Hay casos donde usted quiere mantener a sus conjuntos y la necesidad de un tercer contenedor de todos modos. Acerca de la eficiencia: Josuttis dice que es lineal (en la mayoría de los, 2*(n + m) – 1 comparaciones)
    • set_union puede ser lineal, pero de inserción probablemente no lo es.
    • en C++11 inserter puede ser hecha lineal mediante el uso de la end() iterador como una sugerencia en lugar de begin().

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea