2010-04-09 88 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