C++提高编程 5 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(2):容器1(2)开始迭代器        dest:目标容器开始迭代器

#include<iostream>
using namespace std;
#include<vector>   
#include<numeric>
#include<algorithm>

//常用集合算法   set_intersection    //求两个容器交集
void print1(int val)
{
    cout << val << " ";
}

void test1()
{
    vector<int>v1;
    vector<int>v2;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);            //0~9
        v2.push_back(i + 5);        //5~14
    }
    //for (int j = 14; j > 5; j--)
    //{
    //    v2.push_back(j);        //5~14
    //}


    vector<int>vTarget;
    //目标容器开辟空间
    //最特殊情况  大容器包含小容器  开辟空间取小容器的size即可
    //vTarget.resize(min(v1.size(), v2.size()));        //用三目运算也可以
    vTarget.resize(v1.size() < v2.size() ? v1.size() : v2.size());

    //获取交集
    vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());

    //for_each(vTarget.begin(), vTarget.end(), print1);            //5 6 7 8 9 0 0 0 0 0
    //结束迭代器,得用itEnd才可以得出正确的结果
    for_each(vTarget.begin(), itEnd, print1);                    //5 6 7 8 9
    cout << endl;
}

int main()
{
    test1();

    system("pause");
    return 0;
}

总结:1、求交集的两个集合必须是两个有序序列

   2、目标容器开辟空间需要从两个容器中取较小值

   3、set_intersection返回值即是交集中最后一个元素位置

 

 

 

5.6.2  set_union        //求两个容器并集

函数原型:set_union(iterator  beg1,  iterator  end1,iterator  beg2,  iterator  end2,iterator  dest);

//beg1(2):容器1(2)开始迭代器        dest:目标容器开始迭代器

#include<iostream>
using namespace std;
#include<vector>   
#include<numeric>
#include<algorithm>

//常用集合算法   set_union    //求两个容器并集
void print1(int val)
{
    cout << val << " ";
}

void test1()
{
    vector<int>v1;
    vector<int>v2;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);            //0~9
        v2.push_back(i + 5);        //5~14
    }

    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(vTarget.begin(), vTarget.end(), print1);        //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 0 0 0 0
    for_each(vTarget.begin(), itEnd, print1);                //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
    cout << endl;
}

int main()
{
    test1();

    system("pause");
    return 0;
}

总结:1、求并集的两个集合必须是两个有序序列

   2、目标容器开辟空间需要两个容器size相加

   3、set_union返回值即是并集中最后一个元素位置

 

5.6.3  set_difference      //求两个容器差集

函数原型:set_difference(iterator  beg1,  iterator  end1,iterator  beg2,  iterator  end2,iterator  dest);

//beg1(2):容器1(2)开始迭代器        dest:目标容器开始迭代器

#include<iostream>
using namespace std;
#include<vector>   
#include<numeric>
#include<algorithm>

//常用集合算法   set_difference    //求两个容器差集
void print1(int val)
{
    cout << val << " ";
}

void test1()
{
    vector<int>v1;
    vector<int>v2;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);            //0~9
        v2.push_back(i + 5);        //5~14
    }

    vector<int>vTarget;
    //目标容器开辟空间
    //最特殊情况  两个容器没有交集 取两个容器中大的size作为目标容器的开辟空间
    //vTarget.resize(max(v1.size(), v2.size()));        //用三目运算也可以
    vTarget.resize(v1.size() > v2.size() ? 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(), vTarget.end(), print1);        //0 1 2 3 4 0 0 0 0 0
    for_each(vTarget.begin(), itEnd, print1);                  //0 1 2 3 4
    cout << endl;

    cout << "v2和v1的差集:" << endl;
    itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());

    for_each(vTarget.begin(), vTarget.end(), print1);        //10 11 12 13 14 0 0 0 0 0
    //for_each(vTarget.begin(), itEnd, print1);              //10 11 12 13 14
    cout << endl;
}

int main()
{
    test1();

    system("pause");
    return 0;
}

总结:1、求差集的两个集合必须是两个有序序列

   2、目标容器开辟空间需要从两个容器中取较大值

   3、set_difference返回值即是差集中最后一个元素位置

 

posted @ 2022-03-04 16:18  大白不会敲代码  阅读(78)  评论(0)    收藏  举报