对于内置数据类型的使用(如int)
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
class PrintInt
{
public:
void operator()(int val)
{
cout << val << ' ';
}
};
int main()
{
vector<int>v1, v2;
for(int i = 0; i <= 10; ++i)
{
v1.push_back(i);
v2.push_back(i + 5);
}
vector<int>vTarget;
vTarget.resize(min(v1.size(), v2.size()));//使用该方法之前需要手动开辟目标容器的大小,否则会报错
vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2. end(), vTarget.begin());//利用返回的迭代器位置来确定最后一个数据的位置
for_each(vTarget.begin(), itEnd, PrintInt());
cout << endl;
return 0;
}
该方法是利用模板返回的迭代器位置来确定最后一个元素的位置。如果是自定义类型使用这种方法则会产生一连串的错误!
对于自定义数据类型
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
class stu
{
public:
stu(string _name, int _num)
{
this->name = _name;
this->num = _num;
}
bool operator<(const stu& s)//一定要自行重载“<”运算符,否则会因为没有合适的比较方法而报错
{
return ((this->name < s.name) && (this->num < s.num));
}
string name;
int num;
};
int main()
{
vector<stu>vs1 = { {"aaa", 1}, {"bbb", 2}, {"ccc", 3} };
vector<stu>vs2 = { {"bbb", 2}, {"ddd", 3}, {"eee", 4} };
vector<stu>vsTarget;
set_difference(vs2.begin(), vs2.end(), vs1.begin(), vs1.end(), back_inserter(vsTarget));//该方法不需要自行开辟目标容器的大小,或者说不能手动提前开辟
for (vector<stu>::iterator it = vsTarget.begin(); it != vsTarget.end(); ++it)
{
cout << "姓名:" << it->name << " 学号:" << it->num << '\n';
}
return 0;
}
对于自定义类型推荐使用这种方法,不需要想目标容器需要开到多大。该方法需要在第四个参数使用back_inserter()来确定进行中的迭代器位置。
set_union,set_difference,set_intersection三种模板需要注意的点是一样的。
以上为个人初学防止忘记而做的一个笔记。