2010-04-09 18 views
37

Czy istnieje lepszy sposób dołączania zestawu do innego zestawu niż iterowanie przez każdy element?dołączyć zestaw do innego zestawu

mam:

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

..... 

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

Czy jest bardziej efektywny sposób to zrobić?

Odpowiedz

67

Można wstawić zakres:

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

Co ciekawe C++ 03 gwarantuje czas liniowy !? jako zakres jest sortowany (pochodzi z innego 'zestawu'), ale stosunkowo nowa wersja C++ 0x usunęła tę gwarancję. –

7

To nie jest bardziej skuteczne, ale mniej kodu.

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

Lub wybierz związek, który radzi sobie wydajnie z duplikatami. (jeśli dotyczy)

set<string> baz ; 

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

Nie jestem pewien, co masz na myśli, mówiąc: "... skutecznie radzi sobie z duplikatami". Czy uważasz, że 'insert' nie jest efektywny z duplikatami, wystarczającymi do uzasadnienia użycia trzeciego kontenera? –

+0

@Charles: Dobre pytanie. Są przypadki, w których chciałbyś zachować swoje zestawy i mimo to potrzebujesz trzeciego kontenera. O efektywności: Josuttis mówi, że jest liniowy (najwyżej 2 * (n + m) - 1 porównania) –

+1

'set_union' może być liniowy, ale wprowadzający prawdopodobnie nie jest. – UncleBens

Powiązane problemy