【转】STL算法-合并(集合)

以下内容转载自:http://www.cppblog.com/zhangyq/archive/2012/02/05/164060.html


对于STL合并相关算法有非常详细的总结,其中有几个大名鼎鼎的集合算法,它们是:
(1)求交集:set_intersection()
(2)求并集:set_union()
(3)求差集:set_difference()


--------------------------------------------------------以下为原文--------------------------------------------------------


STL算法(Algorithms):合并(Merge)

1、merge:将两个序列合并成一个新的序列,并对新的序列排序
原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>
  OutputIterator merge ( InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, InputIterator2 last2,OutputIterator result );
template <class InputIterator1, class InputIterator2,class OutputIterator, class Compare>
OutputIterator merge ( InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp );
示例:

//  merge algorithm example
#include <iostream>
#include <algorithm>
#include <vector>
using  namespace std;

int main () {
   int first[] = {5,10,15,20,25};
   int second[] = {50,40,30,20,10};
  vector< int> v(10);
  vector< int>::iterator it;

  sort (first,first+5);
  sort (second,second+5);
  merge (first,first+5,second,second+5,v.begin());

  cout << "The resulting vector contains:";
   for (it=v.begin(); it!=v.end(); ++it)
    cout << " " << *it;

  cout << endl;
  
   return 0;
}



2、inplace_merge:将两个序列合并成一个新的序列,并对新的序列进行归并排序(这两个序列必须要进过排序)
原型:
template <class BidirectionalIterator>
void inplace_merge ( BidirectionalIterator first, BidirectionalIterator middle,
                       BidirectionalIterator last );

template <class BidirectionalIterator, class Compare>
 void inplace_merge ( BidirectionalIterator first, BidirectionalIterator middle,
                       BidirectionalIterator last, Compare comp );
示例:

//  inplace_merge example
#include <iostream>
#include <algorithm>
#include <vector>
using  namespace std;

int main () {
   int first[] = {5,10,15,20,25};
   int second[] = {50,40,30,20,10};
  vector< int> v(10);
  vector< int>::iterator it;

  sort (first,first+5);
  sort (second,second+5);

  copy (first,first+5,v.begin());
  copy (second,second+5,v.begin()+5);

  inplace_merge (v.begin(),v.begin()+5,v.end());

  cout << "The resulting vector contains:";
   for (it=v.begin(); it!=v.end(); ++it)
    cout << " " << *it;

  cout << endl;
  
   return 0;
}


 

3、includes:测试是一个序列是否在另一个序列中
原型:
template <class InputIterator1, class InputIterator2> 
bool includes ( InputIterator1 first1, InputIterator1 last1, 
                InputIterator2 first2, InputIterator2 last2 ); 
template <class InputIterator1, class InputIterator2, class Compare> 
bool includes ( InputIterator1 first1, InputIterator1 last1, 
                InputIterator2 first2, InputIterator2 last2, Compare comp );
示例:

//  includes algorithm example
#include <iostream>
#include <algorithm>
using  namespace std;

bool myfunction ( int i,  int j) {  return i<j; }

int main () {
   int container[] = {5,10,15,20,25,30,35,40,45,50};
   int continent[] = {40,30,20,10};

  sort (container,container+10);
  sort (continent,continent+4);

   //  using default comparison:
   if ( includes(container,container+10,continent,continent+4) )
    cout << "container includes continent!" << endl;

   //  using myfunction as comp:
   if ( includes(container,container+10,continent,continent+4, myfunction) )
    cout << "container includes continent!" << endl;

   return 0;
}


 

4、set_union:和merge类似,不过新序列中没有重复的元素
原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>  
OutputIterator set_union ( InputIterator1 first1, InputIterator1 last1,          
                           InputIterator2 first2, InputIterator2 last2,OutputIterator result );
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>  
OutputIterator set_union ( InputIterator1 first1, InputIterator1 last1, 
                           InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp );
示例:

//  set_union example
#include <iostream>
#include <algorithm>
#include <vector>
using  namespace std;

int main () {
   int first[] = {5,10,15,20,25};
   int second[] = {50,40,30,20,10};
  vector< int> v(10);                            //  0  0  0  0  0  0  0  0  0  0
  vector< int>::iterator it;

  sort (first,first+5);      //   5 10 15 20 25
  sort (second,second+5);    //  10 20 30 40 50

  it=set_union (first, first+5, second, second+5, v.begin());
                                                //  5 10 15 20 25 30 40 50  0  0

  cout << "union has " <<  int(it - v.begin()) << " elements.\n";

   return 0;
}


 

5、set_intersection:两个序列的交集
原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>  
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
                                  InputIterator2 first2, InputIterator2 last2,OutputIterator result );
template <class InputIterator1, class InputIterator2,class OutputIterator, class Compare>
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
                                  InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp );
示例:

//  set_intersection example
#include <iostream>
#include <algorithm>
#include <vector>
using  namespace std;

int main () {
   int first[] = {5,10,15,20,25};
   int second[] = {50,40,30,20,10};
  vector< int> v(10);                            //  0  0  0  0  0  0  0  0  0  0
  vector< int>::iterator it;

  sort (first,first+5);      //   5 10 15 20 25
  sort (second,second+5);    //  10 20 30 40 50

  it=set_intersection (first, first+5, second, second+5, v.begin());
                                                //  10 20 0  0  0  0  0  0  0  0

  cout << "intersection has " <<  int(it - v.begin()) << " elements.\n";

   return 0;
}


 

6、set_difference:序列(first1,last1)不在序列(first2,last2)中的元素
原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>  
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
      InputIterator2 first2, InputIterator2 last2,outputIterator result );
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>  
OutputIterator set_intersection ( InputIterator1 first1, InputIterator1 last1,
                                  InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp );
示例:

//  set_difference example
#include <iostream>
#include <algorithm>
#include <vector>
using  namespace std;

int main () {
   int first[] = {5,10,15,20,25};
   int second[] = {50,40,30,20,10};
  vector< int> v(10);                            //  0  0  0  0  0  0  0  0  0  0
  vector< int>::iterator it;

  sort (first,first+5);      //   5 10 15 20 25
  sort (second,second+5);    //  10 20 30 40 50

  it=set_difference (first, first+5, second, second+5, v.begin());
                                                //  5 15 25  0  0  0  0  0  0  0

  cout << "difference has " <<  int(it - v.begin()) << " elements.\n";

   return 0;
}




  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值