includes,set_union,set_intersection,set_difference

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了includes,set_union,set_intersection,set_difference相关的知识,希望对你有一定的参考价值。

includes

//版本一:用operator <比较元素 
template <class InputerIterator1,class InputerIterator2>
bool includes(InputerIterator1 first1,InputerIterator1 last1,InputerIterator2 first2,InputerIterator2 last2);

//版本二:用自定义的function object比较元素
template <class InputerIterator1,class InputerIterator2,class StrictWeakOrdering>
bool includes(InputerIterator1 first1,InputerIterator1 last1,InputerIterator2 first2,InputerIterator2 last2,StrictWeakOrdering cmp);

  测试已排序的[first2,last2)是否为[first1,last1)的子集,每个集合中的元素不必独一无二,如果某个元素在[first1,last1)出现m次,在[first2,last2)出现n次,如果m<n,则返回false

set_union

//版本一:用operator <比较元素 
template <class InputerIterator1,class InputerIterator2,class OutputIterator>
OutputIterator set_union(InputerIterator1 first1,InputerIterator1 last1,
                        InputerIterator2 first2,InputerIterator2 last2,OutputIterator rseult);

//版本二:用自定义的function object比较元素
template <class InputerIterator1,class InputerIterator2,class OutputIterator,class StrictWeakOrdering>
OutputIterator set_union(InputerIterator1 first1,InputerIterator1 last1,
                        InputerIterator2 first2,InputerIterator2 last2,
                        OutputIterator result,StrictWeakOrdering cmp);

  构造已排序的[first2,last2)和[first1,last1)的联集,每个集合中的元素不必独一无二

  1. 如果某个元素在[first1,last1)出现m次,在[first2,last2)出现n次,在result中出现的次数为max(m,n)
  2. 元素的相对顺序不会被改变,如果是两个集合中都有的元素,那么该元素是从第一个集合中复制来的(去除重复的元素)
  3. 两个集合中的等价元素在result中,m个元素是从第一个range中复制来的,max(n-m,0)个元素从第二个range中复制来

set_intersection

//版本一:用operator <比较元素 
template <class InputerIterator1,class InputerIterator2,class OutputIterator>
OutputIterator set_intersection(InputerIterator1 first1,InputerIterator1 last1,
                        InputerIterator2 first2,InputerIterator2 last2,OutputIterator rseult);

//版本二:用自定义的function object比较元素
template <class InputerIterator1,class InputerIterator2,class OutputIterator,class StrictWeakOrdering>
OutputIterator set_intersection(InputerIterator1 first1,InputerIterator1 last1,
                        InputerIterator2 first2,InputerIterator2 last2,
                        OutputIterator result,StrictWeakOrdering cmp);

  构造两个集合的交集

  如果某个元素在[first1,last1)出现n次,在[first2,last2)出现m次,在result中出现的次数为min(n,m),所有元素赋值于[first1,last1),其他的与set_union相同

set_difference

//版本一:用operator <比较元素 
template <class InputerIterator1,class InputerIterator2,class OutputIterator>
OutputIterator set_difference(InputerIterator1 first1,InputerIterator1 last1,
                        InputerIterator2 first2,InputerIterator2 last2,OutputIterator rseult);

//版本二:用自定义的function object比较元素
template <class InputerIterator1,class InputerIterator2,class OutputIterator,class StrictWeakOrdering>
OutputIterator set_difference(InputerIterator1 first1,InputerIterator1 last1,
                        InputerIterator2 first2,InputerIterator2 last2,
                        OutputIterator result,StrictWeakOrdering cmp);

  构造两个集合的差集,result中的元素出现于第一个range但不出现于第二个range

  某个元素在[first1,last1)中拥有n个彼此等价的元素,在[first2,last2)中拥有m个彼此等价的元素,result中含有max(n-m)个彼此等价的元素,所有元素都复制于[first1,last1)

set_symmetric_difference

//版本一:用operator <比较元素 
template <class InputerIterator1,class InputerIterator2,class OutputIterator>
OutputIterator set_symmetric_difference(InputerIterator1 first1,InputerIterator1 last1,
                        InputerIterator2 first2,InputerIterator2 last2,OutputIterator rseult);

//版本二:用自定义的function object比较元素
template <class InputerIterator1,class InputerIterator2,class OutputIterator,class StrictWeakOrdering>
OutputIterator set_symmetric_difference(InputerIterator1 first1,InputerIterator1 last1,
                        InputerIterator2 first2,InputerIterator2 last2,
                        OutputIterator result,StrictWeakOrdering cmp);

  构造出两个集合之对称差,结果集包含出现于第一个range的元素但不出现于第二个range的元素以及出现于第二个range的元素但不出现于第一个range的元素

  某个元素在[first1,last1)中拥有n个彼此等价的元素,在[first2,last2)中拥有m个彼此等价的元素,result中含有|n-m|个彼此等价的元素,若n>m,则result元素中最后n-m个将由[first1,last1)复制来,若n<m,则result元素中最后m-n个将由[first2,last2)复制来

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

int main()
{
    vector<int> v{1,2,3,4,5,6,6,6};
    vector<int> v1{1,5,6};
    vector<int> v2{1,9,10,11};
    
    cout<<includes(v.begin(),v.end(),v1.begin(),v1.end())<<endl;
    set_union(v2.begin(),v2.end(),v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
    cout<<endl;
    set_intersection(v.begin(),v.end(),v1.begin(),v1.end(),ostream_iterator<int>(cout," "));
    set_difference(v1.begin(),v1.end(),v.begin(),v.end(),ostream_iterator<int>(cout," "));
    cout<<endl;
    set_symmetric_difference(v.begin(),v.end(),v2.begin(),v2.end(),ostream_iterator<int>(cout," "));
    cout<<endl;
    return 0;
}

 

以上是关于includes,set_union,set_intersection,set_difference的主要内容,如果未能解决你的问题,请参考以下文章

set_difference、set_intersection 和 set_union 的就地版本

STL之set篇

PAT1063. Set Similarity (25)

本人碰见一道C语言难题,寻大神帮助,利用C语言实现:求任意两个集合的交集、并集、差集,

STL相关问题

Set容器