创建 returns 类型集合 <int> 的联合函数

create union function that returns type of set<int>

我在完成一个函数时遇到了问题,目前在 main 中调用它时不允许我的程序使用 cout。我正在尝试寻找另一种方法来为以下内容创建函数定义:

set<int> Union(const set<int> & s0, const set<int> & s1);

创建并 returns 一个集合,该集合是另外两个集合(s0 和 s1)的并集。我写的内容(一个函数试图使用 #include 中的 set_union 方法)和所需的输出如下:

期望的输出: 给定集合 s0 有 {1,2,3,4},集合 s1 有 {4,5,6,7},必须创建一个新集合(s3 有 {1,2,3,4,5,6, 7}). 感谢所有帮助。

#include <iostream>
#include <string>
#include <set>
#include <cassert>
#include <algorithm>
using namespace std;
set<int> Union(const set<int> & s0, const set<int> & s1);
int main(){
set<int> s0{1,2,3,4};
set<int> s1{4,5,6,7};
cout << Union(s0,s1) << endl;
}
set<int> Union(const set<int> & s0, const set<int> & s1) {
    set<int> s; 
    set_union(s0.begin(), s0.end(),
        s1.begin(), s1.end(),
        s, s.begin());
    return s;
}

如果您可以使用 C++17,那么 std::set::merge 适合您。请注意,此成员函数会同时改变它所属的对象和函数参数。因此,更改 Union 的函数签名以便复制两个集合对于使用 merge 函数的实现是有意义的:

std::set<int> Union(std::set<int> s0, std::set<int> s1) {
   s0.merge(std::move(s1));

   return s0;
}

您必须像这样将 std::set_unionstd::inserter 一起使用:

std::set<int> Union(const std::set<int> & s0, const std::set<int> & s1) {
    std::set<int> s; 
    std::set_union(s0.begin(), s0.end(),
        s1.begin(), s1.end(),
        std::inserter(s,s.begin()));

    return s;
}

并且您还必须为 std::set.

定义输出流运算符
template <typename T> 
std::ostream& operator<<(std::ostream& os, const std::set<T>& v) 
{ 
    os << "["; 
    for (auto it : v) { 
        os << it; 
        if (it != *v.rbegin()) 
            os << ", "; 
    } 
    os << "]\n"; 
    return os; 
} 

demo here

注意:对于MSVC编译器,需要包含<iterator> header才能使用std::inserter.