2010-04-09 2 views
37

Есть ли лучший способ добавления набора в другой набор, чем итерация через каждый элемент?добавить набор в другой набор

я есть:

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

..... 

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

Есть ли более эффективный способ сделать это?

ответ

67

Вы можете вставить диапазон:

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

Интересно C++ 03 гарантирует линейное время !? поскольку диапазон сортируется (он исходит из другого 'set'), но относительно недавний проект C++ 0x удалил эту гарантию. –

7

Это не более эффективным, но меньше кода.

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

Или возьмите союз, который эффективно работает с дубликатами. (если применимо)

set<string> baz ; 

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

Я не уверен, что вы подразумеваете под «... эффективно работает с дубликатами». Считаете ли вы, что 'insert' неэффективен с дубликатами, достаточными для использования третьего контейнера? –

+0

@Charles: Хороший вопрос. Бывают случаи, когда вы захотите сохранить свои наборы и в любом случае нуждаться в третьем контейнере. Об эффективности: Josuttis говорит, что он является линейным (самое большее, 2 * (n + m) - 1 сравнения) –

+1

'set_union' может быть линейным, но, вероятно, нет. – UncleBens

Смежные вопросы