2011-11-05 36 views
1

有兩個STL set_union大名單

list<int> a (4,100); 
list<int> b (4,200); 

我使用它們作爲一組這樣的排序和uniqued:

a.sort(); 
a.unique(); 
b.sort(); 
b.unique(); 

現在,這兩個名單是這樣的:

a: 100 
b: 200 

現在我計算工會:

list <int> c(a.size() + b.size()); 
set_union(a.begin(), a.end(), b.begin(), b.end(), c.begin()); 

結果很好,但我想要的不是將兩個列表複製到另一個列表中。因爲這個列表非常大,並且不包含實際的整數。

set_union(a.begin(), a.end(), b.begin(), b.end(), a.begin()); 

不行的機器人其實我想要的結果是在一個沒有calulating一大抄,做

a = c; 

aftterwards。另一個問題是,如果a = b = {100},那麼結果c是 {100,0}!

任何想法?

+1

使用'這樣list'幾乎可以肯定是不好的和錯誤的。怎麼了實際的'set'? –

回答

3

您可以最小化複製std::set_difference後跟list::merge。兩者都是線性操作。

std::list<int> a, b, c; 

std::set_difference(b.begin(), b.end(), a.begin(), a.end(), back_inserter(c)); 
a.merge(c); 

b列表不修改,並且臨時c列表爲空。

+0

更詳細和更精確+1 – sehe

2

我覺得你只是想list::merge

std::list<int> a, b; 

a.sort(); 
a.unique(); 
b.sort(); 
b.unique(); 

a.merge(b); 
a.unique(); 

根據您的實際數據可能更快變成這樣

a.sort(); 
b.sort(); 
a.merge(b); 
a.unique(); 
+0

由於每個列表都是分別進行「排序」和「唯一」d,所以之後進行合併並不能保證合併列表是排序的還是唯一的。合併列表中需要額外的「排序」和「唯一」。 –

+0

@SionSheevok那麼,你只是**部分**是正確的。它_does_保證結果是排序的。 「獨特」仍然是必需的。我不能真正查看OP的要求,但會補充說明。注意我的+1與Blastfurnace的回答 – sehe

+0

假設可以保留'b'爲空,你的第二個代碼片段可能是'std :: list'的最快解決方案。 – Blastfurnace