标准库中没有这样的功能吗?
set<T> set::union(set<T> other)
甚至是这个?
set<T> getUnion(set<T> a, set<T> b)
set_union
仅在名称上是正确的功能。它也可以在vector
上运行,这意味着它可能不如set
唯一的功能。
我没有追加。 追加销毁原始集。我想要一个代表联合的 new 集。
答案 0 :(得分:8)
您可以使用双迭代器std::set::insert
模板:
template <typename T>
std::set<T> getUnion(const std::set<T>& a, const std::set<T>& b)
{
std::set<T> result = a;
result.insert(b.begin(), b.end());
return result;
}
注意:根据一些评论建议我按值获取其中一个参数,因为我还需要一个副本,我选择此实现以避免不允许RVO,这在返回参数时是不允许的按价值。为了更好地处理rvalue参数,可以提供此函数的重载,该函数采用rvalue崇敬和利用移动语义。
答案 1 :(得分:4)
该页面的示例使用向量和数组,因此它非常通用:
// set_union example
#include <iostream> // std::cout
#include <algorithm> // std::set_union, std::sort
#include <vector> // std::vector
int main () {
int first[] = {5,10,15,20,25};
int second[] = {50,40,30,20,10};
std::vector<int> v(10); // 0 0 0 0 0 0 0 0 0 0
std::vector<int>::iterator it;
std::sort (first,first+5); // 5 10 15 20 25
std::sort (second,second+5); // 10 20 30 40 50
it=std::set_union (first, first+5, second, second+5, v.begin());
// 5 10 15 20 25 30 40 50 0 0
v.resize(it-v.begin()); // 5 10 15 20 25 30 40 50
std::cout << "The union has " << (v.size()) << " elements:\n";
for (it=v.begin(); it!=v.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
输出:
The union has 8 elements: 5 10 15 20 25 30 40 50