在一个集合中合并多个集合元素


70

我想知道是否有任何标准库或增强工具可以轻松地将多个集合的内容合并为一个集合。

就我而言,我有一些要合并的整数。

Answers:


126

您可以执行以下操作:

std::set<int> s1;
std::set<int> s2;
// fill your sets
s1.insert(s2.begin(), s2.end());

2
我试图理解在合并上下文中多集插入和合并之间的区别。插入每个插入都要花O(logn),所以总共是O(nlogn)。其中n是较小容器的大小。而合并只需要O(n1 + n2)。我能想到的使用插入的唯一原因是它接受任何迭代器,并且第二个复杂度之前具有3的系数。还有其他强烈的理由赞成插入而不是合并。
2014年

1
并非所有情况都一样,这是最简单,最通用的解决方案。
Nicola Musatti 2014年

2
这是次优的解决方案。参见安东尼奥·佩雷斯(AntonioPérez)的答案。
ManuelSchneid3r 2015年

1
不仅如此:在评估std::set_union()的效果时,您应该考虑std::set::insert()重复致电的费用。
Nicola Musatti 2015年

2
真正。如果没有设置输出,我没有考虑插入。好的,这两种方式都在O(n * log(n))中(假设集合相等)。很抱歉。
ManuelSchneid3r 2015年

42

看起来您正在要求std::set_union

例:

#include <set>
#include <algorithm>

std::set<int> s1; 
std::set<int> s2; 
std::set<int> s3;

// Fill s1 and s2 

std::set_union(std::begin(s1), std::end(s1),
               std::begin(s2), std::end(s2),                  
               std::inserter(s3, std::begin(s3)));

// s3 now contains the union of s1 and s2

6
如果您不需要更改原始结构,则此解决方案是最好的。
freitass 2013年

20

使用C ++ 17,您可以直接使用的merge功能set

当您希望将set2元素提取并插入到set1中作为合并的一部分时,这会更好。

如下所示:

set<int> set1{ 1, 2, 3 };
set<int> set2{ 1, 4, 5 };

// set1 has     1 2 3       set2 has     1 4 5
set1.merge(set2);
// set1 now has 1 2 3 4 5   set2 now has 1   (duplicates are left in the source, set2)

5
en.cppreference.com/w/cpp/container/set/merge。复杂度N * log(size()+ N)),其中N是source.size(),我想最好在答案中增加复杂度,因为这与将所有人都插入其中相同吗?
Y00

1
我不确定,如果您要提出问题或猜测或其他。:-) ..但是您对复杂性是正确的。由于您已经增加了复杂性,因此请在+1中添加注释。
Manohar Reddy Poreddy

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.