我在完成功能时遇到麻烦,目前在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;
}
答案 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_union
与std::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
。