有两个
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}!
有什么想法吗?
答案 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();