创建 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_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;
}
注意:对于MSVC编译器,需要包含<iterator>
header才能使用std::inserter
.
我在完成一个函数时遇到了问题,目前在 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_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;
}
注意:对于MSVC编译器,需要包含<iterator>
header才能使用std::inserter
.