【STL使用笔记】set_union,set_difference,set_intersection使用需要注意的细节

对于内置数据类型的使用(如int)
#include 
#include 
#include 
#include 
using namespace std;

 class PrintInt
 {
 public:
     void operator()(int val)
     {
         cout << val << ' ';
     }
 };

int main()
{
	  vectorv1, v2;
      for(int i = 0; i <= 10; ++i)
      {
          v1.push_back(i);
          v2.push_back(i + 5);
      }
      vectorvTarget;
      vTarget.resize(min(v1.size(), v2.size()));//使用该方法之前需要手动开辟目标容器的大小,否则会报错
      vector::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 
#include 
#include 
#include 
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()
{
    vectorvs1 = { {"aaa", 1}, {"bbb", 2}, {"ccc", 3} };
    vectorvs2 = { {"bbb", 2}, {"ddd", 3}, {"eee", 4} };
    vectorvsTarget;

    set_difference(vs2.begin(), vs2.end(), vs1.begin(), vs1.end(), back_inserter(vsTarget));//该方法不需要自行开辟目标容器的大小,或者说不能手动提前开辟
    for (vector::iterator it = vsTarget.begin(); it != vsTarget.end(); ++it)
    {
        cout << "姓名:" << it->name << " 学号:" << it->num << '\n';
    }
	return 0;
}

对于自定义类型推荐使用这种方法,不需要想目标容器需要开到多大。该方法需要在第四个参数使用back_inserter()来确定进行中的迭代器位置。

set_union,set_difference,set_intersection三种模板需要注意的点是一样的。

以上为个人初学防止忘记而做的一个笔记。

你可能感兴趣的:(c++,笔记,开发语言)