STL之set相关算法

STL一共提供了四种set相关的算法,分别是并集(union),交集(intersection),差集(difference),和对称差集(symmetric difference)。
STL的这四个算法所接受的set必须是有序区间,元素可以重复出现。即他们只能接受set/multiset容器作为输入区间。
1、set_unoin(求并集)
算法set_union可构造两个S1,S2这两个集合的并集,这个并集里面包含了S1和S2这两个集合里面的所有元素。set_union的返回值是一个迭代器,指向输出区间的尾端。由于multiset中S1和S2内的元素不需要唯一,所以如果某个值在S1出现n次,在S2出现m次,则这个值会在并集中出现max(m,n)次。
《STL之set相关算法》

函数原型:

template<class InputIterator1,class InputIterator2,class OutputIterator>
OutputIterator set_union(InputIterator1 frist1,InputIterator1 last1,
                         InputIterator2 frist2,InputIterator2 last2,
                                                OutputIterator result);

set_union的函数接口很简单,frist1和last1代表的是S1集合的begin和end,frist2和last2代表的是S2集合的begin和end,result表示存放生成的并集元素的区间的begin。这个返回值是输出区间的end。
例:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<iterator>
#include<vector>
using namespace std;;
void test()
{
    int arr1[5]={1,3,4,5,6};
    int arr2[5]={0,1,2,5,7};
    set<int> set1(arr1,arr1+5);
    set<int> set2(arr2,arr2+5);
    set<int>::iterator it1=set1.begin();
    set<int>::iterator it2=set2.begin();
    set<int>::iterator last1=set1.end();
    set<int>::iterator last2=set2.end();
    while(it1!=set1.end())
    {
        cout<<*it1<<" ";
        it1++;
    }
    cout<<endl;
    while(it2!=set2.end())
    {
        cout<<*it2<<" ";
        it2++;
    }
    cout<<endl;

    it1=set1.begin();
    it2=set2.begin();
    last1=set1.end();
    last2=set2.end();

    vector<int> v;
    v.resize(10);
    vector<int>::iterator ret=v.begin();    
    vector<int>::iterator last=set_union(it1,last1,it2,last2,ret);
    while(ret!=last)
    {
        cout<<*ret<<" ";
        ret++;
    }
    cout<<endl;
}

结果:
《STL之set相关算法》

2、set_intersection(求交集)
算法set_intersection是一种可以构造两个集合S1,S2交集的算法,这个交集里面包含了S1和S2共有的元素。由于multiset中元素可以重复出现,因此如果某个值在S1出现n次,在S2出现m次,则在交集中出现min(n,m)次。
《STL之set相关算法》
函数原型:

template<class InputIterator1,class InputIterator2,class OutputIterator>
OutputIterator set_intersection(InputIterator1 frist1,InputIterator1 last1,
                                InputIterator2 frist2,InputIterator2 last2,
                                                     OutputIterator result);
set_intersection的函数接口很简单,frist1和last1代表的是S1集合的begin和end,frist2和last2代表的是S2集合的begin和end,result表示存放生成的交集元素的区间的begin。这个返回值是输出区间的end。

例:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<iterator>
#include<vector>
using namespace std;;
void test()
{
    int arr1[5]={1,3,4,5,6};
    int arr2[5]={0,1,2,5,7};
    set<int> set1(arr1,arr1+5);
    set<int> set2(arr2,arr2+5);
    set<int>::iterator it1=set1.begin();
    set<int>::iterator it2=set2.begin();
    set<int>::iterator last1=set1.end();
    set<int>::iterator last2=set2.end();
    while(it1!=set1.end())
    {
        cout<<*it1<<" ";
        it1++;
    }
    cout<<endl;
    while(it2!=set2.end())
    {
        cout<<*it2<<" ";
        it2++;
    }
    cout<<endl;   
    it1=set1.begin();
    it2=set2.begin();
    last1=set1.end();
    last2=set2.end();

    vector<int> v;
    v.resize(10);
    vector<int>::iterator ret=v.begin();    
    vector<int>::iterator last=set_intersection(it1,last1,it2,last2,ret);
    while(ret!=last)
    {
        cout<<*ret<<" ";
        ret++;
    }
    cout<<endl;
}

结果:
《STL之set相关算法》

3、set_difference(求差集)
算法set_difference可以构造S1和S2的差集,他能构造出S1-S2,表示出现S1但不出现于S2的每一个元素。由于multiset中元素的值可能重复,因此如果某个值在S1中出现n次,在S2中出现m次,那么这个值在差集中会出现max(n-m,0)次,并且全部来自S1。
《STL之set相关算法》
函数原型:

template<class InputIterator1,class InputIterator2,class OutputIterator>
OutputIterator set_difference(InputIterator1 frist1,InputIterator1 last1,
                                InputIterator2 frist2,InputIterator2 last2,
                                                     OutputIterator result);
set_difference的函数接口很简单,frist1和last1代表的是S1集合的begin和end,frist2和last2代表的是S2集合的begin和end,result表示存放生成的差集元素的区间的begin。这个返回值是输出区间的end。

例:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<iterator>
#include<vector>
using namespace std;;
void test()
{
    int arr1[5]={1,3,4,5,6};
    int arr2[5]={0,1,2,5,7};
    set<int> set1(arr1,arr1+5);
    set<int> set2(arr2,arr2+5);
    set<int>::iterator it1=set1.begin();
    set<int>::iterator it2=set2.begin();
    set<int>::iterator last1=set1.end();
    set<int>::iterator last2=set2.end();
    while(it1!=set1.end())
    {
        cout<<*it1<<" ";
        it1++;
    }
    cout<<endl;
    while(it2!=set2.end())
    {
        cout<<*it2<<" ";
        it2++;
    }
    cout<<endl;

    it1=set1.begin();
    it2=set2.begin();
    last1=set1.end();
    last2=set2.end();

    vector<int> v;
    v.resize(10);
    vector<int>::iterator ret=v.begin();    
    vector<int>::iterator last=set_difference(it1,last1,it2,last2,ret);
    while(ret!=last)
    {
        cout<<*ret<<" ";
        ret++;
    }
    cout<<endl;
}

结果:
《STL之set相关算法》

4、set_symmetric_difference(求对称差集)
算法set_symmetric_difference可构造S1和S2集合的对称差集,所谓的对称差集就是说(S1-S2)U(S2-S1),意思就是说在S1集合出现但不在S2集合出现,在S2集合出现但没在S1集合出现的元素所组成的集合。由于multiset中元素可以重复出现,因此如果某个值在S1中出现n次,在S2中出现m次,那么该值在对称差集中出现|n-m|次。
《STL之set相关算法》
函数原型:

template<class InputIterator1,class InputIterator2,class OutputIterator>
OutputIterator set_symmetric_difference(InputIterator1 frist1,InputIterator1 last1,
                                InputIterator2 frist2,InputIterator2 last2,
                                                     OutputIterator result);
set_symmetric_difference的函数接口很简单,frist1和last1代表的是S1集合的begin和end,frist2和last2代表的是S2集合的begin和end,result表示存放生成的对称差集元素的区间的begin。这个返回值是输出区间的end。

例:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<iterator>
#include<vector>
using namespace std;;
void test()
{
    int arr1[5]={1,3,4,5,6};
    int arr2[5]={0,1,2,5,7};
    set<int> set1(arr1,arr1+5);
    set<int> set2(arr2,arr2+5);
    set<int>::iterator it1=set1.begin();
    set<int>::iterator it2=set2.begin();
    set<int>::iterator last1=set1.end();
    set<int>::iterator last2=set2.end();
    while(it1!=set1.end())
    {
        cout<<*it1<<" ";
        it1++;
    }
    cout<<endl;
    while(it2!=set2.end())
    {
        cout<<*it2<<" ";
        it2++;
    }
    cout<<endl;

    it1=set1.begin();
    it2=set2.begin();
    last1=set1.end();
    last2=set2.end();

    vector<int> v;
    v.resize(10);
    vector<int>::iterator ret=v.begin();    
    vector<int>::iterator last=set_symmetric_difference(it1,last1,it2,last2,ret);
    while(ret!=last)
    {
        cout<<*ret<<" ";
        ret++;
    }
    cout<<endl;
}

结果:
《STL之set相关算法》

点赞