2010-04-09 74 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草案已经删除了这个保证。 – 2010-04-09 12:22:05

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'对重复数据没有效率,足以保证使用第三个容器吗? – 2010-04-09 13:32:40

+0

@Charles:好问题。有些情况下,你会想要保留你的套件并且无论如何都需要第三个容器。关于效率:Josuttis说它是线性的(最多2 *(n + m) - 1比较) – 2010-04-09 14:00:02

+1

'set_union'可能是线性的,但插入可能不是。 – UncleBens 2010-04-09 20:51:56