2010-04-09 10 views
37

Bir grubu başka bir sete eklemek, her bir öğede yinelemekten daha iyi bir yol var mı?ek set başka bir kümeye ayarlanmış

i var:

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

..... 

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

Bunu yapmak için daha etkili bir yolu var mı?

cevap

67

Bir dizi ekleyebilirsiniz:

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

İlginçtir C++ 03, doğrusal zamanı garanti eder !? aralık sıralandığında (başka bir 'set'den gelir), ancak C++ 0x'nin nispeten yeni bir taslağı bu garantiyi sildi. –

7

Bu daha verimli ama daha az kod değildir. Veya çift kopyalarla etkin bir şekilde ilgilenen birliği ele alalım. (varsa)

set<string> baz ; 

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

'Çiftlerle verimli bir şekilde ilgilenir' ile ne kastettiğinizden emin değilim. "Insert" in, üçüncü bir kapsayıcı kullanarak izin vermek için yeterli, çoğaltmaları verimli olmadığını düşünüyor musunuz? –

+0

@Charles: İyi soru. Setlerinizi saklamak istediğiniz ve yine de üçüncü bir konteynere ihtiyaç duyacağınız durumlar var. Verimlilik hakkında: Josuttis doğrusal olduğunu söylüyor (en fazla, 2 * (n + m) - 1 karşılaştırmalar) –

+1

'set_union' doğrusal olabilir, ancak muhtemelen eklenemez. – UncleBens

İlgili konular