2011-11-05 33 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