带有大列表的STL set_union

时间:2011-11-05 18:18:57

标签: c++ stl

有两个

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

我使用它们作为集合因此被排序和单独使用:

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());

不起作用bot我实际上希望结果是在没有计算大副本的情况下做

a = c;

aftterwards。另一个问题是,如果a = b = {100},则结果c为 {100,0}!

有什么想法吗?

2 个答案:

答案 0 :(得分: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列表为空。

答案 1 :(得分: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();