C++集合操作之集合交集:std::set_intersection

C++集合操作之集合交集:std::set_intersection

   算法set_intersection可以用来求两个集合的交集,此处的集合可以为std::set,也可以是std::multiset,但是不可以是hash_set以及hash_multiset。为什么呢?因为set_intersection要求两个区间必须是有序的(从小到大排列),std::set和std::multiset为有序序列,而hash_set以及hash_multiset为无序序列。   

   由于两个集合内的每个元素都不需唯一,因此,如果某个值在区间1中出现m次,在区间2中出现n次,那么该值在输出区间中会出现min(m,n)次,且全部来自于区间1.函数返回值为一个迭代器,指向输出区间的尾部。

   set_intersection为稳定操作,即输出区间内的每个元素的相对顺序都和区间1内的相对顺序相同。

一定谨记:两个区间必须是有序区间(从小到大)

源码如下:

 

[cpp]  view plain  copy
 
  print ?
  1. template<class InputIterator1,class InputIterator2,class OutputIterator>  
  2. OutputIterator set_intersection(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,InputIterator2 last2,OutputIterator result)  
  3. {  
  4.     while (first1!=last1 && first2!=last2) //若均未到达尾端,则进行以下操作  
  5.     {  
  6.         //在两个区间内分别移动迭代器。若二者值相同用result记录该值,移动first1,first2和result  
  7.         //若first1较小,则移动first1,其他不动  
  8.         //若first2较小,则移动first2,其他不动  
  9.         if (*first1<*first2)           
  10.             first1++;             
  11.         else if (*first2<*first1)              
  12.             first2++;         
  13.         else  
  14.         {     
  15.             *result=*first1;  
  16.             first1++;  
  17.             first2++;         
  18.             result++;  
  19.         }         
  20.     }     
  21.     return result;    
  22. }  

示例:

 

 

[cpp]  view plain  copy
 
  print ?
  1. int main(void)  
  2. {  
  3.     int iarr1[]={1,2,3,3,4,5,6,7,9};  
  4.     int iarr2[]={1,4,3,9,10};  
  5.     multiset<int> iset1(begin(iarr1),end(iarr1));  
  6.     multiset<int> iset2(begin(iarr2),end(iarr2));  
  7.     vector<int> ivec(20);      
  8.     auto iter=set_intersection(iset1.begin(),iset1.end(),iset2.begin(),iset2.end(),ivec.begin());   //ivec为:1,3,4,9  
  9.     ivec.resize(iter-ivec.begin());//重新确定ivec大小  
  10.     return 0;  
  11. }  


其实 ,上述代码并不仅限于对两个集合取交集,只要是两个有序区间,均可以用此代码求交集。

 

 

 

用于非set场合:

[cpp]  view plain  copy
 
  print ?
  1. int main(void)  
  2. {  
  3.     int iarr1[]={1,2,3,3,6,7,4,5};  
  4.     int iarr2[]={1,4,3,10,9};  
  5.     std::sort(begin(iarr1),end(iarr1));  
  6.     std::sort(begin(iarr2),end(iarr2));  
  7.     vector<int> ivec(10);    
  8.     auto iter=set_intersection(begin(iarr1),end(iarr1),begin(iarr2),end(iarr2),ivec.begin());   //ivec为:1,2,4,9  
  9.     ivec.resize(iter-ivec.begin());//重新确定ivec大小  
  10.     return 0;  
  11. }  
  12.  

你可能感兴趣的:(theory)