• STL 常用集合算法


    **算法简介:**
    
    - `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 目标容器开始迭代器
    
    
    
    **示例:**
    
    ```C++
    #include <vector>
    #include <algorithm>
    
    class myPrint
    {
    public:
        void operator()(int val)
        {
            cout << val << " ";
        }
    };
    
    void test01()
    {
        vector<int> v1;
        vector<int> 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, myPrint());
        cout << endl;
    }
    
    int main() {
    
        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 目标容器开始迭代器
    **示例:**
    
    ```C++
    #include <vector>
    #include <algorithm>
    
    class myPrint
    {
    public:
        void operator()(int val)
        {
            cout << val << " ";
        }
    };
    
    void test01()
    {
        vector<int> v1;
        vector<int> v2;
        for (int i = 0; i < 10; i++) {
            v1.push_back(i);
            v2.push_back(i+5);
        }
    
        vector<int> vTarget;
        //取两个容器的和给目标容器开辟空间
        vTarget.resize(v1.size() + v2.size());
    
        //返回目标容器的最后一个元素的迭代器地址
        vector<int>::iterator itEnd = 
            set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
    
        for_each(vTarget.begin(), itEnd, myPrint());
        cout << endl;
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }
    ```
    
    **总结:** 
    
    - 求并集的两个集合必须的有序序列
    - 目标容器开辟空间需要**两个容器相加**
    - set_union返回值既是并集中最后一个元素的位置
    #### 5.6.3  set_difference
    
    **功能描述:**
    
    * 求两个集合的差集
    
    
    
    **函数原型:**
    
    - `set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);  `
    
      // 求两个集合的差集
    
      // **注意:两个集合必须是有序序列**
    
      // beg1 容器1开始迭代器
      // end1 容器1结束迭代器
      // beg2 容器2开始迭代器
      // end2 容器2结束迭代器
      // dest 目标容器开始迭代器
    **示例:**
    
    ```C++
    #include <vector>
    #include <algorithm>
    
    class myPrint
    {
    public:
        void operator()(int val)
        {
            cout << val << " ";
        }
    };
    
    void test01()
    {
        vector<int> v1;
        vector<int> v2;
        for (int i = 0; i < 10; i++) {
            v1.push_back(i);
            v2.push_back(i+5);
        }
    
        vector<int> vTarget;
        //取两个里面较大的值给目标容器开辟空间
        vTarget.resize( max(v1.size() , v2.size()));
    
        //返回目标容器的最后一个元素的迭代器地址
        cout << "v1与v2的差集为: " << endl;
        vector<int>::iterator itEnd = 
            set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());
        for_each(vTarget.begin(), itEnd, myPrint());
        cout << endl;
    
    
        cout << "v2与v1的差集为: " << endl;
        itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());
        for_each(vTarget.begin(), itEnd, myPrint());
        cout << endl;
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }
    ```
    
    **总结:** 
    
    - 求差集的两个集合必须的有序序列
    - 目标容器开辟空间需要从**两个容器取较大值**
    - set_difference返回值既是差集中最后一个元素的位置
  • 相关阅读:
    Linux常用命令大全
    Shell常用命令整理
    登录织梦后台提示用户名不存在的解决方法介绍
    dedecms系统后台登陆提示用户名密码不存在
    dede被注入后台提示用户名不存在解决方法
    织梦dedecmsV5.7联动类型无法显示的处理方法
    漏洞安全防范
    Sublime 安装、插件CoolFormat
    如何查看sublime安装了哪些插件
    本地如何使用phpstudy环境搭建多站点
  • 原文地址:https://www.cnblogs.com/gjianli/p/15354507.html
Copyright © 2020-2023  润新知