добавить набор в другой набор

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

у меня есть :

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

.....

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

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


person mr.bio    schedule 09.04.2010    source источник


Ответы (2)


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

bar.insert(foo.begin(), foo.end());
person CB Bailey    schedule 09.04.2010
comment
Интересно C++03 гарантирует линейное время!? поскольку диапазон отсортирован (он исходит из другого set), но относительно недавний проект C++0x удалил эту гарантию. - person CB Bailey; 09.04.2010

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

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

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

set<string> baz ;

set_union(foo.begin(), foo.end(),
      bar.begin(), bar.end(),
      inserter(baz, baz.begin()));
person Eddy Pronk    schedule 09.04.2010
comment
Я не уверен, что вы подразумеваете под «... эффективно справляется с дубликатами». Считаете ли вы, что insert неэффективен с дубликатами, достаточными для использования третьего контейнера? - person CB Bailey; 09.04.2010
comment
@Чарльз: Хороший вопрос. Есть случаи, когда вы хотели бы сохранить свои наборы и все равно нуждаетесь в третьем контейнере. Об эффективности: Йосуттис говорит, что она линейна (максимум 2*(n + m) - 1 сравнение) - person Eddy Pronk; 09.04.2010
comment
@UncleBens, в С++ 11 inserter можно сделать линейным, используя итератор end() в качестве подсказки, а не begin(). - person Mark Ransom; 03.05.2014