创建返回set <int>类型的联合函数

时间:2019-03-01 08:53:45

标签: c++ visual-studio c++14 discrete-mathematics

我在完成功能时遇到麻烦,目前在main中调用程序时,我的程序无法使用cout。我正在尝试寻找一种替代方法来创建以下功能的定义:

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

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

所需的输出: 给定集合s0具有{1,2,3,4}并且集合s1具有{4,5,6,7},必须创建一个新集合(具有{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;
}

2 个答案:

答案 0 :(得分:2)

如果您可以使用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;
}

答案 1 :(得分:2)

您必须像这样将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>标头以使用std::inserter