2010-04-09 7 views
37

Existe-t-il un meilleur moyen d'ajouter un ensemble à un autre ensemble que de parcourir chaque élément?Ajout d'un ensemble à un autre ensemble

j'ai:

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

..... 

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

est-il un moyen plus efficace de le faire?

Répondre

67

Vous pouvez insérer une plage:

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

Fait intéressant C++ 03 garantit le temps linéaire !? comme la plage est triée (elle vient d'un autre 'set'), mais un brouillon relativement récent de C++ 0x a supprimé cette garantie. –

7

Il est pas un code plus efficace mais moins.

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

Ou prendre l'union qui traite efficacement les doublons. (le cas échéant)

set<string> baz ; 

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

Je ne suis pas sûr de ce que vous entendez par «... traite efficacement les doublons». Pensez-vous que «insérer» n'est pas efficace avec des doublons, suffisant pour justifier l'utilisation d'un troisième conteneur? –

+0

@Charles: Bonne question. Il y a des cas où vous voudriez garder vos ensembles et avez besoin d'un troisième récipient de toute façon. A propos de l'efficacité: Josuttis dit qu'il est linéaire (tout au plus, 2 * (n + m) - 1 comparaisons) –

+1

'set_union' peut être linéaire, mais l'inserteur ne l'est probablement pas. – UncleBens

Questions connexes