首页 > 代码库 > 第22章 变易算法

第22章 变易算法

 

 

第22章 变易算法  Modifying  sequence operations


   22.1 元素复制copy
copy  Copy range of elements (function template)   
   22.2 反向复制copy_backward
copy_backward  Copy range of elements backwards (function template)   
   22.3 元素交换swap
swap  Exchange values of two objects (function template)   
   22.4 迭代器交换iter_swap
iter_swap  Exchange values of objects pointed by two iterators (function template)   
   22.5 区间元素交换swap_ranges
swap_ranges  Exchange values of two ranges (function template)   
   22.6 元素变换transform
transform  Apply function to range (function template)   
   22.7 替换Replace
replace  Replace value in range (function template)   
   22.8 条件替换replace_if
replace_if  Replace values in range (function template)   
   22.9 替换和复制replace_copy
replace_copy  Copy range replacing value (function template)   
   22.10 条件替换和复制replace_copy_if
replace_copy_if  Copy range replacing value (function template)   
   22.11 填充fill
fill  Fill range with value (function template)   
   22.12 n次填充fill_n
fill_n  Fill sequence with value (function template)   
   22.13 随机生成元素generate
generate  Generate values for range with function (function template)   
   22.14 随机生成n个元素generate_n
generate_n  Generate values for sequence with function (function template)   
   22.15 移除复制remove_copy
remove_copy  Copy range removing value (function template)
   22.16 条件移除复制remove_copy_if
remove_copy_if  Copy range removing values (function template)
   22.17 移除remove
remove  Remove value from range (function template)
   22.18 条件移除remove_if
remove_if  Remove elements from range (function template)
   22.19 不连续重复元素复制unique_copy
unique_copy  Copy range removing duplicates (function template)
   22.20 剔除连续重复元素unique
unique  Remove consecutive duplicates in range (function template)
   22.21 元素反向reverse
reverse  Reverse range (function template)
   22.22 反向复制reverse_copy
reverse_copy  Copy range reversed (function template)
   22.23 旋转rotate
rotate  Rotate elements in range (function template)
   22.24 旋转复制rotate_copy
rotate_copy  Copy rotated range (function template)
   22.25 随机抖动random_shuffle
random_shuffle  Rearrangle elements in range randomly (function template)   
   22.26 随机采样random_sample
...
   22.27 容器分割partition
partition  Partition range in two (function template)   
   22.28 容器稳定分割stable_partition
stable_partition  Divide range in two groups - stable ordering (function template)   
   22.29 本章小结

 

/*  第22章 变易算法   22.1 元素复制copy   22.2 反向复制copy_backward   22.3 元素交换swap   22.4 迭代器交换iter_swap   22.5 区间元素交换swap_ranges   22.6 元素变换transform   22.7 替换Replace   22.8 条件替换replace_if   22.9 替换和复制replace_copy   22.10 条件替换和复制replace_copy_if   22.11 填充fill   22.12 n次填充fill_n   22.13 随机生成元素generate   22.14 随机生成n个元素generate_n   22.15 移除复制remove_copy   22.16 条件移除复制remove_copy_if   22.17 移除remove   22.18 条件移除remove_if   22.19 不连续重复元素复制unique_copy   22.20 剔除连续重复元素unique   22.21 元素反向reverse   22.22 反向复制reverse_copy   22.23 旋转rotate   22.24 旋转复制rotate_copy   22.25 随机抖动random_shuffle   22.26 随机采样random_sample   22.27 容器分割partition   22.28 容器稳定分割stable_partition   22.29 本章小结  第22章 变易算法Modifying  sequence operations:     22.1 元素复制copycopy  Copy range of elements (function template)      22.2 反向复制copy_backwardcopy_backward  Copy range of elements backwards (function template)      22.3 元素交换swapswap  Exchange values of two objects (function template)      22.4 迭代器交换iter_swapiter_swap  Exchange values of objects pointed by two iterators (function template)      22.5 区间元素交换swap_rangesswap_ranges  Exchange values of two ranges (function template)      22.6 元素变换transformtransform  Apply function to range (function template)      22.7 替换Replacereplace  Replace value in range (function template)      22.8 条件替换replace_ifreplace_if  Replace values in range (function template)      22.9 替换和复制replace_copyreplace_copy  Copy range replacing value (function template)      22.10 条件替换和复制replace_copy_ifreplace_copy_if  Copy range replacing value (function template)      22.11 填充fillfill  Fill range with value (function template)      22.12 n次填充fill_nfill_n  Fill sequence with value (function template)      22.13 随机生成元素generategenerate  Generate values for range with function (function template)      22.14 随机生成n个元素generate_ngenerate_n  Generate values for sequence with function (function template)      22.15 移除复制remove_copyremove_copy  Copy range removing value (function template)   22.16 条件移除复制remove_copy_ifremove_copy_if  Copy range removing values (function template)   22.17 移除removeremove  Remove value from range (function template)   22.18 条件移除remove_ifremove_if  Remove elements from range (function template)   22.19 不连续重复元素复制unique_copyunique_copy  Copy range removing duplicates (function template)   22.20 剔除连续重复元素uniqueunique  Remove consecutive duplicates in range (function template)   22.21 元素反向reversereverse  Reverse range (function template)   22.22 反向复制reverse_copyreverse_copy  Copy range reversed (function template)   22.23 旋转rotaterotate  Rotate elements in range (function template)   22.24 旋转复制rotate_copyrotate_copy  Copy rotated range (function template)   22.25 随机抖动random_shufflerandom_shuffle  Rearrangle elements in range randomly (function template)      22.26 随机采样random_sample...   22.27 容器分割partitionpartition  Partition range in two (function template)      22.28 容器稳定分割stable_partitionstable_partition  Divide range in two groups - stable ordering (function template)      22.29 本章小结*/
View Code

 

 

 


 

 

  第22章 变易算法
Modifying  sequence operations: 
   22.1 元素复制copy
copy  Copy range of elements (function template)  

//  第22章 变易算法//   22.1 元素复制copy ---------------------------------------------------template<class InputIterator, class OutputIterator>  OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result ){  while (first!=last) *result++ = *first++;  return result;}// 把序列一中某范围内的元素,复制到序列二中去。前两个参数是序列一范围,第三个参数是序列二的开始位置// 当序列二不够大时,不够装部分将复制不过去。// copy algorithm example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  int myints[]={10,20,30,40,50,60,70};  vector<int> myvector;  vector<int>::iterator it;  myvector.resize(7);   // allocate space for 7 elements                        // 如7改成5,将只复制前5个元素  copy ( myints, myints+7, myvector.begin() );  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}// 304#include <algorithm>#include <vector>#include <list>#include <iostream>using namespace std;void print(int x){  cout << x << "  ";}int main(void){  //初始化向量v  vector < int > v;  v.push_back(1);  v.push_back(3);  v.push_back(5);  //初始化双向链表l  list < int > l;  l.push_back(2);  l.push_back(4);  l.push_back(6);  l.push_back(8);  l.push_back(10);  //复制v到l  copy(v.begin(), v.end(), l.begin());  //链表l打印l 3 5 8 10  for_each(l.begin(), l.end(), print);  cout << endl;  return 0;}

 


   22.2 反向复制copy_backward
copy_backward  Copy range of elements backwards (function template)  

//   22.2 反向复制copy_backward ---------------------------------------------------template<class BidirectionalIterator1, class BidirectionalIterator2>  BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,                                         BidirectionalIterator1 last,                                         BidirectionalIterator2 result ){  while (last!=first) *(--result) = *(--last);  return result;}// 把序列一中某范围内的元素,复制到序列二中去。前两个参数是序列一范围,第三个参数是序列二的结束位置的下一个位置。// 两序列可以是同一序列// copy_backward example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  vector<int> myvector;  vector<int>::iterator it;  // set some values:  for (int i=1; i<=5; i++)    myvector.push_back(i*10);          // myvector: 10 20 30 40 50  myvector.resize(myvector.size()+3);  // allocate space for 3 more elements  copy_backward ( myvector.begin(), myvector.begin()+5, myvector.end() );  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}//306 始终是左闭右开区间操作#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  vector < int > v(10);  for(unsigned int i = 0; i < v.size(); i++)    v[i] = i + 1;  // 1 2 3 4 5 6 7 8 9 10  copy_backward(v.begin(), v.begin() + 3, v.end());  for_each(v.begin(), v.end(), print);  cout << endl;    // 1 2 3 4 5 6 7 1 2 3  return 0;}

 


   22.3 元素交换swap
swap  Exchange values of two objects (function template)  

//   22.3 元素交换swap ---------------------------------------------------template <class T> void swap ( T& a, T& b ){  T c(a); a=b; b=c;}// 不通过指针交换两个元素// swap algorithm example。只要是同一类型的,统统交换#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  int x=10, y=20;                         // x:10 y:20  swap(x,y);                              // x:20 y:10  vector<int> first (4,x), second (6,y);  // first:4x20 second:6x10  swap(first,second);                     // first:6x10 second:4x20  cout << "first contains:";  for (vector<int>::iterator it=first.begin(); it!=first.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}//307#include <algorithm>#include <iostream>int main(void){  using namespace std;  int a = 5;  int b = 26;  cout << "交换前 " << "a = " << a << " b = " << b << endl;  swap(a, b);  cout << "交换后 " << "a = " << a << " b = " << b << endl;  return 0;}

 


   22.4 迭代器交换iter_swap
iter_swap  Exchange values of objects pointed by two iterators (function template)  

//   22.4 迭代器交换iter_swap ---------------------------------------------------template <class ForwardIterator1, class ForwardIterator2>  void iter_swap ( ForwardIterator1 a, ForwardIterator2 b ){  swap (*a, *b);}// 利用指针(迭代器)交换值// iter_swap example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  int myints[]={10,20,30,40,50 };          //   myints:  10  20  30  40  50  vector<int> myvector (4,99);             // myvector:  99  99  99  99  iter_swap(myints,myvector.begin());      //   myints: [99] 20  30  40  50                                           // myvector: [10] 99  99  99  iter_swap(myints+3,myvector.begin()+2);  //   myints:  99  20  30 [99]                                           // myvector:  10  99 [40] 99  cout << "myvector contains:";  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}// 307#include <algorithm>#include <iostream>int main(void){  using namespace std;  int a = 5;  int b = 26;  cout << "交换前 " << "a = " << a << " b = " << b << endl;  iter_swap(&a, &b);  cout << "交换后 " << "a = " << a << " b = " << b << endl;  return 0;}

 


   22.5 区间元素交换swap_ranges
swap_ranges  Exchange values of two ranges (function template)  

//   22.5 区间元素交换swap_ranges ---------------------------------------------------template<class ForwardIterator1, class ForwardIterator2>  ForwardIterator2 swap_ranges ( ForwardIterator1 first1, ForwardIterator1 last1,                                 ForwardIterator2 first2 ){  while (first1!=last1) swap(*first1++, *first2++);  return first2;}// 两个区间中的元素分别交换。只有三个参数,第四个参数又省了// 注意:第二个序列要足够长,否则会出现异常,见下面第二个程序。// swap_ranges example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  vector<int> first (5,10);        //  first: 10 10 10 10 10  vector<int> second (5,33);       // second: 33 33 33 33 33  vector<int>::iterator it;  swap_ranges(first.begin()+1, first.end()-1, second.begin());  // print out results of swap:  cout << " first contains:";  for (it=first.begin(); it!=first.end(); ++it)    cout << " " << *it;  cout << "\nsecond contains:";  for (it=second.begin(); it!=second.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}// swap_ranges example. my test:请观察输出结果,当第二个序列不够长时,交换到第一个序列的,不是希望的值!#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  vector<int> first (5,10);        //  first: 10 10 10 10 10  vector<int> second (2,33);       // second: 33 33  vector<int>::iterator it;  swap_ranges(first.begin()+1, first.end()-1, second.begin());  // print out results of swap:  cout << " first contains:";  for (it=first.begin(); it!=first.end(); ++it)    cout << " " << *it;  cout << "\nsecond contains:";  for (it=second.begin(); it!=second.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}//308#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x << " ";}int main(void){  vector < int > v1, v2;  v1.push_back(1);  v1.push_back(3);  v1.push_back(5);  v2.push_back(2);  v2.push_back(4);  v2.push_back(6);  //打印v1、v2  cout << "交换前, v1=";  for_each(v1.begin(), v1.end(), print);  cout << "v2=";  for_each(v2.begin(), v2.end(), print);  cout << endl;  //交换v1、v2  swap_ranges(v1.begin(), v1.end(), v2.begin());  //打印v1、v2  cout << "交换后, v1=";  for_each(v1.begin(), v1.end(), print);  cout << "v2=";  for_each(v2.begin(), v2.end(), print);  cout << endl;  return 0;}

 


   22.6 元素变换transform
transform  Apply function to range (function template)  

//   22.6 元素变换transform ---------------------------------------------------template < class InputIterator, class OutputIterator, class UnaryOperator >  OutputIterator transform ( InputIterator first1, InputIterator last1,                             OutputIterator result, UnaryOperator op ){  while (first1 != last1)    *result++ = op(*first1++);  // or: *result++=binary_op(*first1++,*first2++);  return result;}// 加转换的copy。而且转换函数可以是一元的,也可以是二元的。// 一元的参数有四个:开始两个表示第一序列范围,第三个是结果存放开始位置,第四个是一元函数(对象)// 二元的参数有五个:开始两个表示第一序列范围,第三个是第二序列开始位置,第四个是结果存放开始位置,第五个是二元函数(对象)// transform algorithm example#include <iostream>#include <algorithm>#include <vector>using namespace std;int op_increase (int i) { return ++i; }int op_sum (int i, int j) { return i+j; }int main () {  vector<int> first;  vector<int> second;  vector<int>::iterator it;  // set some values:  for (int i=1; i<6; i++) first.push_back (i*10); //  first: 10 20 30 40 50  second.resize(first.size());     // allocate space  transform (first.begin(), first.end(), second.begin(), op_increase); // 四个参数                                                  // second: 11 21 31 41 51  transform (first.begin(), first.end(), second.begin(), first.begin(), op_sum); // 五个参数                                                  //  first: 21 41 61 81 101  cout << "first contains:";  for (it=first.begin(); it!=first.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}// 309#include <algorithm>#include <vector>#include <list>#include <iostream>using namespace std;int square(int x){  return x *x;}void print(int x){  cout << x << "  ";}int main(void){  //vector初始化      vector < int > v;  v.push_back(5);  v.push_back(15);  v.push_back(25);  //list初始化  list < int > l(3);  //对vector容器元素执行平方运算,放入list容器  transform(v.begin(), v.end(), l.begin(), square);  //打印链表元素  for_each(l.begin(), l.end(), print);  cout << endl;  return 0;}

 


   22.7 替换Replace
replace  Replace value in range (function template)  

//   22.7 替换 ---------------------------------------------------template < class ForwardIterator, class T >  void replace ( ForwardIterator first, ForwardIterator last,                 const T& old_value, const T& new_value ){  for (; first != last; ++first)    if (*first == old_value) *first=new_value;}// 在指定范围内旧值换新值// replace algorithm example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };  vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20  replace (myvector.begin(), myvector.end(), 20, 99); // 10 99 30 30 99 10 10 99  cout << "myvector contains:";  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;   return 0;}//311#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x << "  ";}int main(void){  vector < int > v;  v.push_back(13);  v.push_back(25);  v.push_back(27);  v.push_back(25);  v.push_back(29);  //将v的25全部替换为100  replace(v.begin(), v.end(), 25, 100);  cout << "v向量元素: ";  for_each(v.begin(), v.end(), print);  cout << endl;  //将iArray的5全部替换为200  int iArray[7] = {3, 6, 5, 9, 5, 5, 10};  replace(iArray, iArray + 7, 5, 200);  cout << "数组iArray元素: ";  for_each(iArray, iArray + 7, print);  cout << endl;  return 0;}

 


   22.8 条件替换replace_if
replace_if  Replace values in range (function template)  

//   22.8 条件替换replace_if ---------------------------------------------------template < class ForwardIterator, class Predicate, class T >  void replace_if ( ForwardIterator first, ForwardIterator last,                    Predicate pred, const T& new_value ){  for (; first != last; ++first)    if (pred(*first)) *first=new_value;}// 当元素满足什么条件时,更新为新值// replace_if example#include <iostream>#include <algorithm>#include <vector>using namespace std;bool IsOdd (int i) { return ((i%2)==1); }int main () {  vector<int> myvector;  vector<int>::iterator it;  // set some values:  for (int i=1; i<10; i++) myvector.push_back(i);          // 1 2 3 4 5 6 7 8 9    replace_if (myvector.begin(), myvector.end(), IsOdd, 0); // 0 2 0 4 0 6 0 8 0                                                           // 把奇数都替换为0  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;   return 0;}// 312#include <algorithm>#include <vector>#include <iostream>bool odd(int x){  return x % 2;}int main(void){  using namespace std;  vector < int > v(10);  unsigned int i;  for(i = 0; i < v.size(); i++)  {    v[i] = i % 7;    cout << v[i] <<  ;  }  cout << endl;  //将奇数元素替换为38  replace_if(v.begin(), v.end(), odd, 38);  for(i = 0; i < v.size(); i++)    cout << v[i] <<  ;  cout << endl;  return 0;}

 


   22.9 替换和复制replace_copy
replace_copy  Copy range replacing value (function template)  

//   22.9 替换和复制replace_copy ---------------------------------------------------template < class InputIterator, class OutputIterator, class T >  OutputIterator replace_copy ( InputIterator first, InputIterator last,                                OutputIterator result, const T& old_value, const T& new_value ){  for (; first != last; ++first, ++result)    *result = (*first==old_value)? new_value: *first;  return result;}// 将第一序列某范围内的元素,复制到第二序列中去。在这个复制过程中,将旧值,替换为新值// 前两个参数表示第一序列范围,第三个参数为第二序列开始位置(木有结束位置),第四、五个参数为旧、新值// replace_copy example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };  vector<int> myvector (8);  replace_copy (myints, myints+8, myvector.begin(), 20, 99);  cout << "myvector contains:";  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;   return 0;}// 313#include <algorithm>#include <list>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  list < int > l1;  l1.push_back(1);  l1.push_back(3);  l1.push_back(1);  l1.push_back(6);  l1.push_back(8);  //将l1链表元素1替换为100,然后拷贝到l2链表  list < int > l2(5);  replace_copy(l1.begin(), l1.end(), l2.begin(), 1, 100);  cout << "l1保持不变: ";  for_each(l1.begin(), l1.end(), print);  cout << "\nl2元素为: ";  for_each(l2.begin(), l2.end(), print);  cout << endl;  return 0;}

 


   22.10 条件替换和复制replace_copy_if
replace_copy_if  Copy range replacing value (function template)  

//   22.10 条件替换和复制replace_copy_if ---------------------------------------------------template < class InputIterator, class OutputIterator, class Predicate, class T >  OutputIterator replace_copy_if ( InputIterator first, InputIterator last,                                   OutputIterator result, Predicate pred,                                   const T& new_value ){  for (; first != last; ++first, ++result)    *result = (pred(*first))? new_value: *first;  return result;}// replace_copy的谓词判断版本。 木有旧值了,替换为一个谓词。这样应用范围更广// replace_copy_if example#include <iostream>#include <algorithm>#include <vector>using namespace std;bool IsOdd (int i) { return ((i%2)==1); }int main () {  vector<int> first,second;  vector<int>::iterator it;  // set some values:  for (int i=1; i<10; i++) first.push_back(i);          // 1 2 3 4 5 6 7 8 9  second.resize(first.size());   // allocate space  replace_copy_if (first.begin(), first.end(), second.begin(), IsOdd, 0);                                                        // 0 2 0 4 0 6 0 8 0  cout << "second contains:";  for (it=second.begin(); it!=second.end(); ++it)    cout << " " << *it;  cout << endl;   return 0;}// 314#include <algorithm>#include <vector>#include <list>#include <iostream>using namespace std;bool odd(int x){  return x % 2;}int main(void){  using namespace std;  vector < int > v(10);  unsigned int i;  for(i = 0; i < v.size(); i++)  {    v[i] = i % 7;    cout << v[i] <<  ;  }  cout << endl;  //将向量v中奇数元素替换为38后,拷贝到链表l  list < int > l(10);  replace_copy_if(v.begin(), v.end(), l.begin(), odd, 38);  list < int > ::iterator list_iter;  for(list_iter = l.begin(); list_iter != l.end(); list_iter++)    cout <<  *list_iter <<  ;  cout << endl;  return 0;}

 


   22.11 填充fill
fill  Fill range with value (function template)  

//   22.11 填充fill ---------------------------------------------------template < class ForwardIterator, class T >  void fill ( ForwardIterator first, ForwardIterator last, const T& value ){  while (first != last)  *first++ = value;}// 在序列范围内,均填充上某新值。// fill algorithm example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0  fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0  fill (myvector.begin()+3,myvector.end()-2,8);   // myvector: 5 5 5 8 8 8 0 0  cout << "myvector contains:";  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;   return 0;}//315#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  vector < int > v(5);  fill(v.begin(), v.end(), 30);  for_each(v.begin(), v.end(), print);  cout << endl;  return 0;}

 


   22.12 n次填充fill_n
fill_n  Fill sequence with value (function template)  

//   22.12 n次填充fill_n ---------------------------------------------------template < class OutputIterator, class Size, class T >  void fill_n ( OutputIterator first, Size n, const T& value ){  for (; n>0; --n)  *first++ = value;}// 在起始位置开始,填充n个value。三个参数:起始位置、几个、新值。// fill_n example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  vector<int> myvector (8,10);        // myvector: 10 10 10 10 10 10 10 10  fill_n (myvector.begin(),4,20);     // myvector: 20 20 20 20 10 10 10 10  fill_n (myvector.begin()+3,3,33);   // myvector: 20 20 20 33 33 33 10 10  cout << "myvector contains:";  for (vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;   return 0;}//315#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  vector < int > v(8);  fill(v.begin(), v.end(), 1);  //前5个元素填充为2  fill_n(v.begin(), 5, 2);  for_each(v.begin(), v.end(), print);  cout << endl;  //全部填充为3  fill_n(v.begin(), v.size(), 3);  for_each(v.begin(), v.end(), print);  cout << endl;  return 0;}

 


   22.13 随机生成元素generate
generate  Generate values for range with function (function template)  

//   22.13 随机生成元素generate ---------------------------------------------------template <class ForwardIterator, class Generator>  void generate ( ForwardIterator first, ForwardIterator last, Generator gen ){  while (first != last)  *first++ = gen();}// 在指定范围内,填充上第三个参数gen产生的值。// gen是个函数(对象),木有参数。所以产生的值,纯粹取决于gen,与容器原来的元素无关// generate algorithm example#include <iostream>#include <algorithm>#include <vector>#include <ctime>#include <cstdlib>using namespace std;// function generator:int RandomNumber () { return (rand()%100); } // 产生一百以内的随机数// class generator:struct c_unique {  int current;  c_unique() {current=0;} // 构造函数,设成员current初始值为0  int operator()() {return ++current;} // 调用操作符()重载,使此类能产生函数对象} UniqueNumber;int main () {  srand ( unsigned ( time(NULL) ) );  vector<int> myvector (8);  vector<int>::iterator it;  generate (myvector.begin(), myvector.end(), RandomNumber);  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  generate (myvector.begin(), myvector.end(), UniqueNumber);  cout << "\nmyvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;   return 0;}//316#include <algorithm>#include <vector>#include <iostream>using namespace std;//等差数列an+1=an + 3class sequence{  public:    int a;    sequence(){ a = 0; } // 构造函数    inline int operator()() // 重载()    {        //a = a + 3;        //return a;        return a+=3;    }};void print(int x){  cout << x << endl;}int main(void){  vector < int > v(10);  sequence an;  generate(v.begin(), v.end(), an);  for_each(v.begin(), v.end(), print);  cout << endl;  return 0;}

 


   22.14 随机生成n个元素generate_n
generate_n  Generate values for sequence with function (function template)  

//   22.14 随机生成n个元素generate_n ---------------------------------------------------template <class OutputIterator, class Size, class Generator>  void generate ( OutputIterator first, Size n, Generator gen ){  for (; n>0; --n)  *first++ = gen();}// 在开始位置之后,填充n个gen()产生的值。三个参数:起始位置、几个、gen产生的值。// generate_n example#include <iostream>#include <algorithm>#include <vector>using namespace std;int current(0);int UniqueNumber () { return ++current; }int main () {  vector<int> myvector (9);  vector<int>::iterator it;  generate_n (myvector.begin(), 6, UniqueNumber); // 因为产生6个,后面几个仍是0  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;   return 0;}//317#include <algorithm>#include <vector>#include <iostream>int main(void){  using namespace std;  vector < int > v(10);  //生成3个伪随机数  generate_n(v.begin(), 3, rand);  for(unsigned int i = 0; i < v.size(); i++)    cout << v[i] <<  ;  cout << endl;  return 0;}

 


   22.15 移除复制remove_copy
remove_copy  Copy range removing value (function template)

//   22.15 移除复制remove_copy ---------------------------------------------------template <class InputIterator, class OutputIterator, class T>  OutputIterator remove_copy ( InputIterator first, InputIterator last,                               OutputIterator result, const T& value ){  for ( ; first != last; ++first)    if (!(*first == value)) *result++ = *first;  return result;}// 将容器中,不等于某值的元素,复制到另一容器中。// 参数有四个:前两个表示范围,第三个是另一容器的起始位置,第四个是某值。// 这样就产生了一个问题,另一容器,可以是同一容器么?可以的,请看下面第二个my test程序。// remove_copy example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  int myints[] = {10,20,30,30,20,10,10,20};          // 10 20 30 30 20 10 10 20  vector<int> myvector (8);  // 如改成2,可以看到,容器不会自动扩充,只会复制进2个数。  vector<int>::iterator it;  remove_copy (myints,myints+8,myvector.begin(),20); // 10 30 30 10 10 0 0 0  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;   return 0;}// remove_copy example。my test: 同一容器是可以的。#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  int myints[] = {10,20,30,30,20,10,10,20};          // 10 20 30 30 20 10 10 20  vector<int> myvector (myints,myints+8);  vector<int>::iterator it;                                                     // 10 30 30 10 10 [10 10 20  remove_copy (myvector.begin(),myvector.end(),myvector.begin(),20); // 最后三个是原来的  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;   return 0;}//318#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x << "  ";}int main(void){  vector < int > v;  v.push_back(2);  v.push_back(4);  v.push_back(3);  v.push_back(4);  v.push_back(8);  //  int iArray[6]={0};  //  remove_copy(v.begin(), v.end(), iArray, 4);  for_each(v.begin(), v.end(), print);  cout << endl;  //  for_each(iArray, iArray + 6, print);  cout << endl;  return 0;}

 


   22.16 条件移除复制remove_copy_if
remove_copy_if  Copy range removing values (function template)

//   22.16 条件移除复制remove_copy_if ---------------------------------------------------template <class InputIterator, class OutputIterator, class Predicate>  OutputIterator remove_copy_if ( InputIterator first, InputIterator last,                                  OutputIterator result, Predicate pred ){  for ( ; first != last; ++first)    if (!pred(*first)) *result++ = *first;  return result;}// remove_copy 的带谓词判断的版本。把第四个参数,改成了函数(对象)。// remove_copy_if example#include <iostream>#include <algorithm>#include <vector>using namespace std;bool IsOdd (int i) { return ((i%2)==1); }int main () {  int myints[] = {1,2,3,4,5,6,7,8,9};            vector<int> myvector (9);  vector<int>::iterator it;  remove_copy_if (myints,myints+9,myvector.begin(),IsOdd); // 是奇数的,被删除  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;   return 0;}// 319#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x << "  ";}bool even(int x){  //偶数  return x % 2 ? 0 : 1;}int main(void){  //初始化向量v  vector < int > v;  v.push_back(7);  v.push_back(2);  v.push_back(5);  v.push_back(4);  v.push_back(1);  //初始化数组iArray  int iArray[6] = {0};  //移除v中偶数,剩余元素复制到iArray  remove_copy_if(v.begin(), v.end(), iArray, even);  //打印v,v没有改变  for_each(v.begin(), v.end(), print);  cout << endl;  //打印iArray  for_each(iArray, iArray + 6, print);  cout << endl;  return 0;}

 


   22.17 移除remove
remove  Remove value from range (function template)

//   22.17 移除remove ---------------------------------------------------template < class ForwardIterator, class T >  ForwardIterator remove ( ForwardIterator first, ForwardIterator last, const T& value ){  ForwardIterator result = first;  for ( ; first != last; ++first)    if (!(*first == value)) *result++ = *first;  return result;}// 将容器中等于某值的元素删除。// 因为在同一容器中操作,所以返回值值得关注。返回排列完删除某些元素之后的序列的后一个位置。// 如果要将数据复制到另一容器,可以考虑用remove_copy// remove algorithm example#include <iostream>#include <algorithm>using namespace std;int main () {  int myints[] = {10,20,30,30,20,10,10,20};      // 10 20 30 30 20 10 10 20  // bounds of range:  int* pbegin = myints;                          // ^  int* pend = myints+sizeof(myints)/sizeof(int); // ^                       ^  pend = remove (pbegin, pend, 20);              // 10 30 30 10 10 10 10 20                                                 // ^              ^  cout << "range contains:";  for (int* p=pbegin; p!=pend; ++p)    cout << " " << *p;  cout << endl;   return 0;}// 321#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x << "  ";}int main(void){  //初始化向量v  vector < int > v;  v.push_back(2);  v.push_back(4);  v.push_back(3);  v.push_back(4);  v.push_back(8);  //移除4  vector < int > ::iterator result = remove(v.begin(), v.end(), 4);  //打印2 3 8  for_each(v.begin(), result, print);  cout << endl;  //打印2 3 8 4 8  for_each(v.begin(), v.end(), print);  cout << endl;  return 0;}

 


   22.18 条件移除remove_if
remove_if  Remove elements from range (function template)

//   22.18 条件移除remove_if ---------------------------------------------------template < class ForwardIterator, class Predicate >  ForwardIterator remove_if ( ForwardIterator first, ForwardIterator last,                              Predicate pred ){  ForwardIterator result = first;  for ( ; first != last; ++first)    if (!pred(*first)) *result++ = *first;  return result;}// remove的谓词判断版本。 remove的第三个参数,改成了谓词判断。// remove_if example#include <iostream>#include <algorithm>using namespace std;bool IsOdd (int i) { return ((i%2)==1); }int main () {  int myints[] = {1,2,3,4,5,6,7,8,9};            // 1 2 3 4 5 6 7 8 9  // bounds of range:  int* pbegin = myints;                          // ^  int* pend = myints+sizeof(myints)/sizeof(int); // ^                 ^  pend = remove_if (pbegin, pend, IsOdd);        // 2 4 6 8 5 6 7 8 9                                                 // ^       ^  cout << "range contains:";  for (int* p=pbegin; p!=pend; ++p)    cout << " " << *p;  cout << endl;   return 0;}// 322#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x << "  ";}bool even(int x){  //偶数  return x % 2 ? 0 : 1;}int main(void){  //初始化向量v  vector < int > v;  v.push_back(7);  v.push_back(2);  v.push_back(5);  v.push_back(4);  v.push_back(1);  //移除偶数  vector < int > ::iterator result = remove_if(v.begin(), v.end(), even);  //打印7 5 1  for_each(v.begin(), result, print);  cout << endl;  //打印7 5 1 4 1  for_each(v.begin(), v.end(), print);  cout << endl;  return 0;}

 


   22.19 不连续重复元素复制unique_copy
unique_copy  Copy range removing duplicates (function template)

//   22.19 不连续重复元素复制unique_copy ---------------------------------------------------template <class InputIterator, class OutputIterator>  OutputIterator unique_copy ( InputIterator first, InputIterator last,                               OutputIterator result ){  *result=*first;  while (++first != last)  {    if (!(*result == *first))  // or: if (!pred(*result,*first)) for the pred version      *(++result)=*first; // 有点精巧,画图可明白。pred左参数,是左边那个与当前值不同那个元素,右参数是当前元素  }  return ++result; // 左闭右开原则,返回时要+1}// 将连续相等的元素过滤掉,只剩下一个// 第四个参数可选,如有,是谓词判断的函数(对象)。这个谓词估计不常用。// 第三个参数是输出的第一个位置。可以用同一容器,也可以用不同容器。// unique_copy example#include <iostream>#include <algorithm>#include <vector>using namespace std;bool myfunction (int i, int j) {  return (i==j);}int main () {  int myints[] = {10,20,20,20,30,30,20,20,10};  vector<int> myvector (9);                            // 0  0  0  0  0  0  0  0  0  vector<int>::iterator it;  // using default comparison:  it=unique_copy (myints,myints+9,myvector.begin());   // 10 20 30 20 10 0  0  0  0                                                       //                ^  sort (myvector.begin(),it);                          // 10 10 20 20 30 0  0  0  0                                                       //                ^  // using predicate comparison:  it=unique_copy (myvector.begin(), it, myvector.begin(), myfunction);                                                       // 10 20 30 20 30 0  0  0  0                                                       //          ^  myvector.resize( it - myvector.begin() );            // 10 20 30  // print out content:  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}//323#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  vector < int > v;  v.push_back(2);  v.push_back(5);  v.push_back(5);  v.push_back(5);  v.push_back(6);  v.push_back(5);  v.push_back(2);  //  int iArray[6] = { 0 };  //  unique_copy(v.begin(), v.end(), iArray);  //打印2 5 6 5 2 0  for_each(iArray, iArray + 6, print);  cout << endl;  return 0;}

 


   22.20 剔除连续重复元素unique
unique  Remove consecutive duplicates in range (function template)

//   22.20 剔除连续重复元素unique ---------------------------------------------------template <class ForwardIterator>  ForwardIterator unique ( ForwardIterator first, ForwardIterator last ){  ForwardIterator result=first;  while (++first != last)  {    if (!(*result == *first))  // or: if (!pred(*result,*first)) for the pred version      *(++result)=*first;  }  return ++result;}// 将连续相等的元素过滤掉,只剩下一个。在同一容器操作。// 第三个参数可无,如有是谓词判断函数(对象)// unique algorithm example#include <iostream>#include <algorithm>#include <vector>using namespace std;bool myfunction (int i, int j) {  return (i==j);}int main () {  int myints[] = {10,20,20,20,30,30,20,20,10};    // 10 20 20 20 30 30 20 20 10  vector<int> myvector (myints,myints+9);  vector<int>::iterator it;  // using default comparison:  it = unique (myvector.begin(), myvector.end()); // 10 20 30 20 10 30 20 20 10                                                  //                ^  myvector.resize( it - myvector.begin() );       // 10 20 30 20 10  // using predicate comparison:  unique (myvector.begin(), myvector.end(), myfunction);   // (no changes)  // print out content:  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}// 325#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  vector < int > v;  v.push_back(2);  v.push_back(6);  v.push_back(6);  v.push_back(6);  v.push_back(9);  v.push_back(6);  v.push_back(3);  //  vector < int > ::iterator result = unique(v.begin(), v.end());  //打印2 6 9 6 3  for_each(v.begin(), result, print);  cout << endl;  //打印2 6 9 6 3 6 3  for_each(v.begin(), v.end(), print);  cout << endl;  return 0;}

 


   22.21 元素反向reverse
reverse  Reverse range (function template)

//   22.21 元素反向reverse ---------------------------------------------------template <class BidirectionalIterator>  void reverse ( BidirectionalIterator first, BidirectionalIterator last){  while ((first!=last)&&(first!=--last))    swap (*first++,*last);}// 反转元素// reverse algorithm example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  vector<int> myvector;  vector<int>::iterator it;  // set some values:  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9  reverse(myvector.begin(),myvector.end());       // 9 8 7 6 5 4 3 2 1  // print out content:  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}//326#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  vector < int > v(10);  for(unsigned int i = 0; i < v.size(); i++)    v[i] = i;  for_each(v.begin(), v.end(), print);  cout << endl;  //  reverse(v.begin(), v.end());  for_each(v.begin(), v.end(), print);  cout << endl;  return 0;}

 


   22.22 反向复制reverse_copy
reverse_copy  Copy range reversed (function template)

//   22.22 反向复制reverse_copy ---------------------------------------------------template <class BidirectionalIterator, class OutputIterator>  OutputIterator reverse_copy ( BidirectionalIterator first,                                BidirectionalIterator last, OutputIterator result ){  while (first!=last) *result++ = *--last;  return result;}// 从后向前,复制到另一容器。// 复制到同一容器,可以吗? 请见以下第二个程序,my test。// my test:复制到同一空间(范围),会产生冲突。复制到同一容器不同范围,木有关系。// reverse_copy example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  int myints[] ={1,2,3,4,5,6,7,8,9};  vector<int> myvector;  vector<int>::iterator it;  myvector.resize(9);  reverse_copy (myints, myints+9, myvector.begin());  // print out content:  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}// reverse_copy example。 my test:复制到同一空间(范围),会产生冲突。复制到同一容器不同范围,木有关系。#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  int myints[] ={1,2,3,4,5,6,7,8,9};  vector<int> v(myints,myints+9);  vector<int>::iterator it;    reverse_copy(v.begin(),v.begin()+3,v.begin());  // print out content:  cout << "myvector contains:";  for (it=v.begin(); it!=v.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}// 327#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  vector < int > v(10);  for(unsigned int i = 0; i < v.size(); i++)    v[i] = i;  //  int iArray[10] = {0};  //  reverse_copy(v.begin(), v.end(), iArray);  for_each(iArray, iArray + 10, print);  cout << endl;  return 0;}

 


   22.23 旋转rotate
rotate  Rotate elements in range (function template)

//   22.23 旋转rotate ---------------------------------------------------template <class ForwardIterator>  void rotate ( ForwardIterator first, ForwardIterator middle,                ForwardIterator last ){  ForwardIterator next = middle;  while (first!=next)  {    swap (*first++,*next++);    if (next==last) next=middle;    else if (first == middle) middle=next; // 这种交换方法,非常新颖。可以画图理解  }}// 旋转交换。[first,middle) 与 [middle,last),两区域的元素,进行交换。两区域的元素个数不一定要相等。// 如 1,2,3,4,5 ,以4为middle,--> 4,5,1,2,3 。 三个参数:first, middle, last// rotate algorithm example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  vector<int> myvector;  vector<int>::iterator it;  // set some values:  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9  rotate(myvector.begin(),myvector.begin()+3,myvector.end());                                                  // 4 5 6 7 8 9 1 2 3  // print out content:  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}// 329#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  vector < int > v(10);  unsigned int i;  for(i = 0; i < v.size(); i++)    v[i] = i + 1;  for_each(v.begin(), v.end(), print);  cout << endl;  //  cout << "开始旋转,middle元素=" << *(v.begin() + 7) << endl;  rotate(v.begin(), v.begin() + 7, v.end());  for_each(v.begin(), v.end(), print);  return 0;}

 


   22.24 旋转复制rotate_copy
rotate_copy  Copy rotated range (function template)

//   22.24 旋转复制rotate_copy ---------------------------------------------------template <class ForwardIterator, class OutputIterator>  OutputIterator rotate_copy ( ForwardIterator first, ForwardIterator middle,                               ForwardIterator last, OutputIterator result ){  result=copy (middle,last,result);  return copy (first,middle,result);}// 与rotate类似,无非是拷贝到了另一容器。四个参数:first, middle, last, result// rotate_copy algorithm example#include <iostream>#include <algorithm>#include <vector>using namespace std;int main () {  int myints[] = {10,20,30,40,50,60,70};  vector<int> myvector;  vector<int>::iterator it;  myvector.resize(7);  rotate_copy(myints,myints+3,myints+7,myvector.begin());  // print out content:  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}// 329#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  vector < int > v(10);  for(unsigned int i = 0; i < v.size(); i++)    v[i] = i + 1;  //  int iArray[10] ={0};  //  cout << "开始旋转复制,*middle选为" << *(v.begin() + 7) << endl;  rotate_copy(v.begin(), v.begin() + 7, v.end(), iArray);  for_each(iArray, iArray + 10, print);  cout << endl;  return 0;}

 


   22.25 随机抖动random_shuffle
random_shuffle  Rearrangle elements in range randomly (function template)  

//   22.25 随机抖动random_shuffle ---------------------------------------------------template <class RandomAccessIterator, class RandomNumberGenerator>  void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,                        RandomNumberGenerator& rand ){  iterator_traits<RandomAccessIterator>::difference_type i, n;  n = (last-first);  for (i=2; i<n; ++i) swap (first[i],first[rand(i)]);}// shuffle 洗牌。第三个参数可无,如有,是自定义的随机发生器。// random_shuffle example#include <iostream>#include <algorithm>#include <functional>#include <vector>#include <ctime>#include <cstdlib>using namespace std;// random generator function:ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}// pointer object to it:ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;int main () {  srand ( unsigned ( time (NULL) ) );  vector<int> myvector;  vector<int>::iterator it;  // set some values:  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9  // using built-in random generator:  random_shuffle ( myvector.begin(), myvector.end() );  // using myrandom:  random_shuffle ( myvector.begin(), myvector.end(), p_myrandom);  // print out content:  cout << "myvector contains:";  for (it=myvector.begin(); it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}//331#include <algorithm>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  int iArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };  cout << "随机抖动iArray三次" << endl;  for(int i = 0; i < 3; i++)  {    random_shuffle(iArray, iArray + 10);    for_each(iArray, iArray + 10, print);    cout << endl;  }  return 0;}

 


   22.26 随机采样random_sample
...

//   22.26 随机采样random_sample ---------------------------------------------------// 333 。random_sample不是标准函数。我们可以采用另两个函数,来达到相同的目的:#include <algorithm>#include <vector>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}int main(void){  vector < int > v(10);  for(unsigned int i = 0; i < v.size(); i++)    v[i] = i % 8;  //  cout << "v= ";  for_each(v.begin(), v.end(), print);  cout << endl;  //  const int n = 6; //采样个数  int iArray[n];  //random_sample(v.begin(), v.end(), iArray, iArray + n);  random_shuffle(v.begin(),v.end());  copy(v.begin(),v.begin()+n,iArray);  //  cout << n << "个采样元素为 ";  for_each(iArray, iArray + n, print);  cout << endl;  return 0;}

 


   22.27 容器分割partition
partition  Partition range in two (function template)  

//   22.27 容器分割partition ---------------------------------------------------template <class BidirectionalIterator, class Predicate>  BidirectionalIterator partition ( BidirectionalIterator first,                                    BidirectionalIterator last, Predicate pred ){  while (first!=last) // 可以看到快排的影子  {    --last;    while (first!=last && pred(*first)) ++first;    while (first!=last && !pred(*last)) --last;    if (first!=last) swap (*first++,*last);  }  return first;}// 把序列分成两部分,前一部分满足条件,后一部分不满足条件。三个参数。// partition algorithm example#include <iostream>#include <algorithm>#include <vector>using namespace std;bool IsOdd (int i) { return (i%2)==1; }int main () {  vector<int> myvector;  vector<int>::iterator it, bound;  // set some values:  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9  bound = partition (myvector.begin(), myvector.end(), IsOdd);  // print out content:  cout << "odd members:";  for (it=myvector.begin(); it!=bound; ++it)    cout << " " << *it;  cout << "\neven members:";  for (it=bound; it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}// 334#include <algorithm>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}bool less10(int x){  return x < 10;}int main(void){  int iArray[10] = { 16,  - 1, 3, 11, 2, 5, 8, 20, 9, 3 };  int *result = partition(iArray, iArray + 10, less10);  cout << "按小于10进行分割" << endl;  for_each(iArray, iArray + 10, print);  cout << endl;  //  cout << "partition算法返回的分界元素为 " <<  *result << endl;  return 0;}

 


   22.28 容器稳定分割stable_partition
stable_partition  Divide range in two groups - stable ordering (function template)  

//   22.28 容器稳定分割stable_partition ---------------------------------------------------// partition 的稳定版本// stable_partition example#include <iostream>#include <algorithm>#include <vector>using namespace std;bool IsOdd (int i) { return (i%2)==1; }int main () {  vector<int> myvector;  vector<int>::iterator it, bound;  // set some values:  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9  bound = stable_partition (myvector.begin(), myvector.end(), IsOdd);  // print out content:  cout << "odd members:";  for (it=myvector.begin(); it!=bound; ++it)    cout << " " << *it;  cout << "\neven members:";  for (it=bound; it!=myvector.end(); ++it)    cout << " " << *it;  cout << endl;  return 0;}// 338#include <algorithm>#include <iostream>using namespace std;void print(int x){  cout << x <<  ;}bool less10(int x){  return x < 10 ? 1 : 0;}int main(void){  int iArray[10] = { 16,  - 1, 3, 11, 2, 5, 8, 20, 9, 3 };  for_each(iArray, iArray + 10, print);  cout << endl;  //进行稳定分割  int *result = stable_partition(iArray, iArray + 10, less10);  cout << "按小于10稳定分割,iArray数组变为" << endl;  for_each(iArray, iArray + 10, print);  cout << endl;  //  cout << "iArray数组有如下小于10的整数" << endl;  for_each(iArray, result, print);  cout << endl;  //  cout << "stable_partition算法返回的分界元素为 " <<  *result << endl;  return 0;}

 


   22.29 本章小结

 

/***************************************************************************************************************//   22.29 本章小结 ---------------------------------------------------   22.1 元素复制copy// 把序列一中某范围内的元素,复制到序列二中去。前两个参数是序列一范围,第三个参数是序列二的开始位置// 当序列二不够大时,不够装部分将复制不过去。   22.2 反向复制copy_backward// 把序列一中某范围内的元素,复制到序列二中去。前两个参数是序列一范围,第三个参数是序列二的结束位置的下一个位置。// 两序列可以是同一序列   22.3 元素交换swap// 不通过指针交换两个元素   22.4 迭代器交换iter_swap// 利用指针(迭代器)交换值   22.5 区间元素交换swap_ranges// 两个区间中的元素分别交换。只有三个参数,第四个参数又省了// 注意:第二个序列要足够长,否则会出现异常。   22.6 元素变换transform// 加转换的copy。而且转换函数可以是一元的,也可以是二元的。// 一元的参数有四个:开始两个表示第一序列范围,第三个是结果存放开始位置,第四个是一元函数(对象)// 二元的参数有五个:开始两个表示第一序列范围,第三个是第二序列开始位置,第四个是结果存放开始位置,第五个是二元函数(对象)   22.7 替换Replace// 在指定范围内旧值换新值   22.8 条件替换replace_if// 当元素满足什么条件时,更新为新值   22.9 替换和复制replace_copy// 将第一序列某范围内的元素,复制到第二序列中去。在这个复制过程中,将旧值,替换为新值// 前两个参数表示第一序列范围,第三个参数为第二序列开始位置(木有结束位置),第四、五个参数为旧、新值   22.10 条件替换和复制replace_copy_if// replace_copy的谓词判断版本。 木有旧值了,替换为一个谓词。这样应用范围更广   22.11 填充fill// 在序列范围内,均填充上某新值。   22.12 n次填充fill_n// 在起始位置开始,填充n个value。三个参数:起始位置、几个、新值。   22.13 随机生成元素generate// 在指定范围内,填充上第三个参数gen产生的值。// gen是个函数(对象),木有参数。所以产生的值,纯粹取决于gen,与容器原来的元素无关   22.14 随机生成n个元素generate_n// 在开始位置之后,填充n个gen()产生的值。三个参数:起始位置、几个、gen产生的值。   22.15 移除复制remove_copy// 将容器中,不等于某值的元素,复制到另一容器中。// 参数有四个:前两个表示范围,第三个是另一容器的起始位置,第四个是某值。// 这样就产生了一个问题,另一容器,可以是同一容器么?可以的。   22.16 条件移除复制remove_copy_if// remove_copy 的带谓词判断的版本。把第四个参数,改成了函数(对象)。   22.17 移除remove// 将容器中等于某值的元素删除。// 因为在同一容器中操作,所以返回值值得关注。返回排列完删除某些元素之后的序列的后一个位置。// 如果要将数据复制到另一容器,可以考虑用remove_copy   22.18 条件移除remove_if// remove的谓词判断版本。 remove的第三个参数,改成了谓词判断。   22.19 不连续重复元素复制unique_copy// 将连续相等的元素过滤掉,只剩下一个// 第四个参数可选,如有,是谓词判断的函数(对象)。这个谓词估计不常用。// 第三个参数是输出的第一个位置。可以用同一容器,也可以用不同容器。   22.20 剔除连续重复元素unique// 将连续相等的元素过滤掉,只剩下一个。在同一容器操作。// 第三个参数可无,如有是谓词判断函数(对象)   22.21 元素反向reverse// 反转元素   22.22 反向复制reverse_copy// 从后向前,复制到另一容器。// 复制到同一容器,可以吗? 请见以下第二个程序,my test。// my test:复制到同一空间(范围),会产生冲突。复制到同一容器不同范围,木有关系。   22.23 旋转rotate// 旋转交换。[first,middle) 与 [middle,last),两区域的元素,进行交换。两区域的元素个数不一定要相等。// 如 1,2,3,4,5 ,以4为middle,--> 4,5,1,2,3 。 三个参数:first, middle, last   22.24 旋转复制rotate_copy// 与rotate类似,无非是拷贝到了另一容器。四个参数:first, middle, last, result   22.25 随机抖动random_shuffle// shuffle 洗牌。第三个参数可无,如有,是自定义的随机发生器。   22.26 随机采样random_sample//random_sample不是标准函数。我们可以采用另两个函数,来达到相同的目的  //random_sample(v.begin(), v.end(), iArray, iArray + n);  random_shuffle(v.begin(),v.end());  copy(v.begin(),v.begin()+n,iArray);   22.27 容器分割partition// 把序列分成两部分,前一部分满足条件,后一部分不满足条件。三个参数。   22.28 容器稳定分割stable_partition// partition 的稳定版本   22.29 本章小结// 这就是小结***********************************************************************************************************/

 

 

 

 

 

  

 

 

00TOP00

 

第22章 变易算法