2010-04-09 12 views
37

Gibt es eine bessere Möglichkeit, ein Set an ein anderes Set anzuhängen, als jedes Element zu durchlaufen?Append-Set zu einem anderen Set

ich habe:

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

..... 

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

Gibt es eine effizientere Art und Weise, dies zu tun?

Antwort

67

können Sie eine Reihe einfügen:

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

Interessanterweise garantiert C++ 03 lineare Zeit !? da der Bereich sortiert ist (er kommt von einem anderen 'set'), aber ein relativ neuer Entwurf von C++ 0x hat diese Garantie gelöscht. –

7

Es ist kein effizienter, aber weniger Code.

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

Oder nehmen Sie die Union, die effizient mit Dubletten behandelt. (falls zutreffend)

set<string> baz ; 

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

Ich bin mir nicht sicher, was Sie mit "... effizient mit Dubletten umgehen" meinen. Glauben Sie, dass das Einfügen mit Duplikaten nicht effizient genug ist, um die Verwendung eines dritten Containers zu rechtfertigen? –

+0

@Charles: Gute Frage. Es gibt Fälle, in denen Sie Ihre Sets behalten und trotzdem einen dritten Container benötigen. Über Effizienz: Josuttis sagt, es ist linear (höchstens 2 * (n + m) - 1 Vergleiche) –

+1

'set_union' kann linear sein, aber Inserter ist wahrscheinlich nicht. – UncleBens

Verwandte Themen