C++提高 第五章STL-常用算法之集合算法

5.6 常用集合算法

学习目标:

  • 掌握常用的集合算法

算法简介:

  • set_intersection //求两个容器的交集

  • set_union //求两个容器的并集

  • set_difference //求两个容器的差集

5.6.1 set_intersection

功能描述:

  • 求两个容器的交集

函数原型:

  • set_intersection(iterator beg1, iterator end1,iterator beg2,iterator end2,iterator dest);

//求两个集合的交集

//注意:两个集合必须是有序序列

//beg1 容器1 开始迭代器

//end1 容器1 结束迭代器

//beg2 容器2 开始迭代器

//end2 容器2 结束迭代器

//dest 目标容器开始迭代器

示例:

 #include <iostream>
 using namespace std;
 #include<string>
 //容器头文件
 #include <vector>
 #include<algorithm>
 ​
 //常用集合算法 set_intersection
 //打印函数
 class MyPrint
 {
 public:
     void operator()(int val)
     {
     cout << val << " ";
      }
     
 };
 void test01()
 {
     //创建容器v1 v2
     vector<int>v1;
     vector<int> v2;
     //插入数据 0 5
     for (int i=0;i<10;i++)
     {
         v1.push_back(i);
         v2.push_back(i + 5);
     }
     //创建目标容器 vTarget
     vector<int> vTarget;
     //目标容器需要提前开辟空间
     //最特殊情况是 大容器包含 小容器 去小容器的size即可 min()
      vTarget.resize(min(v1.size(), v2.size()));
     //获取交集 用自定义的迭代器接收itEnd 
 ​
      vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(),v2.end(), vTarget.begin());
     // 遍历数据
      for_each(vTarget.begin(), itEnd, MyPrint());
      cout << endl;
 ​
 }
 ​
 int main()
 {
 ​
     
     //调用测试test01()
     test01();
     
     system("pause");
     return 0;
 }
 ​
 ​

运行图:

 

总结:

  • 求交集的两个集合必须得是有序序列

  • 目标容器开辟空间需要从两个容器中取最小值

  • set_intersection 返回值既是交集中最后一个元素的位置

5.6.2 set_union

功能描述:

  • 求两个集合的并集

函数原型:

  • set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest)

//求两个集合的并集

//注意:两个集合必须是有序序列

//beg1 容器1 开始迭代器

//end1 容器1 结束迭代器

//beg2 容器2 开始迭代器

//end2 容器2 结束迭代器

//dest 目标容器开始迭代器

示例:

 #include <iostream>
 using namespace std;
 #include<string>
 //容器头文件
 #include <vector>
 #include<algorithm>
 ​
 //常用集合算法 set_union
 //打印函数
 void myPrint(int val)
 {
     cout << val << " ";
 }
 ​
 void test01()
 {
     //创建容器 v1,v2
     vector<int> v1;
     vector<int>v2;
     //插入数据
     for (int i=0;i<=10;i++)
     {
         v1.push_back(i);
         v2.push_back(i + 5);
     }
     //创建容器 vTarget
     vector<int>vTarget;
     //目标容器提前开辟空间
     //最特殊情况 两个容器没有交集 ,并集就是这两个容器size相加
     vTarget.resize(v1.size() + v2.size());
     //并集   返回最后一个迭代器的位置
     vector<int>::iterator itEnd=set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
     //输出 for_each
     for_each(vTarget.begin(), itEnd, myPrint);
     cout << endl;
 ​
 }
 ​
 int main()
 {
 ​
     
     //调用测试test01()
     test01();
     
     system("pause");
     return 0;
 }
 ​
 ​

运行图:

 

总结:

  • 求并集的两个集合必须是有序序列

  • 目标容器开辟空间需要两个容器的size相加

  • set_unioin返回值既是并集中最后一个元素的位置

5.6.3 set_difference

功能描述:

  • 求两个集合的差集

函数原型:

  • set_difference(iterator beg1,interator end1,interator beg2,interator end2,interator dest);

//求两个集合的差集

//注意两个集合必须是有序序列

//beg1 容器1 开始迭代器

//end1 容器1 结束迭代器

//beg2 容器2 开始迭代器

//end2 容器2 结束迭代器

//dest 目标容器开始迭代器

示例:

 #include <iostream>
using namespace std;
#include<string>
//容器头文件
#include <vector>
#include<algorithm>

//常用集合算法  set_difference 
//打印函数
void myPrint(int val)
{
    cout << val << " ";
}
void test01()
{
    //创建容器v1,v2
    vector<int> v1;
    vector<int> v2;
    //插入数据
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
        v2.push_back(i + 5);
    }
    //创建目标容器 vTarget
    vector<int>vTarget;
    //给目标容器开辟空间
    //最特殊情况 两个容器没有交集 取两个容器中大的size作为目标容器开辟空间max
    vTarget.resize(max(v1.size(), v2.size()));


    //做差集
    //v1和v2差集
    vector<int>::iterator  itEnd = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    //打印for_each
    cout << "v1和v2差集" << endl;
    for_each(vTarget.begin(), itEnd, myPrint);
    cout << endl;
    //v2和v1差集
    vector<int>::iterator  itEnd2 = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
    //打印 for_each
    cout << "v2和v1差集" << endl;
    for_each(vTarget.begin(), itEnd2, myPrint);
    cout << endl;
}

int main()
{


    //调用测试test01()
    test01();

    system("pause");
    return 0;
}

 

运行图:

总结:

  • 求差集的两个集合必须为有序序列

  • 目标容器开辟空间需要从两个容器取最大值

  • set_difference 返回值既是差集最后一个元素的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值