1. 程式人生 > >程式碼合集(1)——容器演算法之合併 merge

程式碼合集(1)——容器演算法之合併 merge

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;
}

7、set_symmetric_difference:所有不在序列(first1,last1)和序列(first2,last2)中的元素
原型:
template <class InputIterator1, class InputIterator2, class OutputIterator>  
OutputIterator    set_symmetric_difference ( InputIterator1 first1, InputIterator1 last1,
                                             InputIterator2 first2, InputIterator2 last2,OutputIterator result );
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 
OutputIterator    set_symmetric_difference ( InputIterator1 first1, InputIterator1 last1, 
                                             InputIterator2 first2, InputIterator2 last2,OutputIterator result, Compare comp );
示例:

// set_symmetric_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_symmetric_difference (first, first+5, second, second+5, v.begin());
                                               // 5 15 25 30 40 50  0  0  0  0
  cout << "symmetric difference has " << int(it - v.begin()) << " elements.\n";

  return 0;
}