好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

STL学习笔记变易算法

STL学习笔记变易算法

STL学习笔记--变易算法

变易算法

    C++ STL 的变易算法 (Mutating algorithms) 是一组能够修改容器元素数据的模板函数,可进行序列数据的复制、交换、替换、填充、移除、旋转、随机抖动和分割。这些算法对迭代器有较高的要求,具体的迭代器类型随各个算法而定,或前向迭代器、或双向迭代器、又或者是随机迭代器,以提供算法所需要的迭代器操作。应用变易算法时,先要检查容器的迭代器是否符合要求,防止产生编译错误。

目录:   

元素复制 copy                                           反向复制 copy_backward                     元素交换 swap       

迭代器交换 iter_swap                                  区间元素交换 swap_ranges                   元素变换 transform       

替换 replace                                             条件替换 replace_if                             替换和复制 replace_copy       

条件替换和复制 replace_copy_if                     填充 fill                                             n次填充 fill_n       

随机生成元素 generate                                随机生成n个元素 generate_n                  移除复制 remove_copy       

条件移除复制 remove_copy_if                       移除 remove                                      条件移除 remove_if       

不连续重复元素复制 unique_copy                   剔除连续重复元素 unique                       元素反向 reverse       

反向复制 reverse_copy                               旋转 rotate                                       旋转复制 rotate_copy       

随机抖动 random_shuffle                             容器分割 partition                               容器稳定分割 stable_partition       

  

应用 copy 算法复制向量vector元素链表到链表 list

 1   /*      下面示例程序将向量{1  3  5},拷贝到链表{2 4 6 8 10}的首元素开始位置,结果链表的前3个元素被拷贝覆盖掉,打印输出为“1 3 5 8 10”
   2   */ 
  3  -----------------------------------------------  应用 copy 算法复制向量vector元素链表到链表 list
   4  #include <algorithm>
  5  #include <vector>
  6  #include <list>
  7  #include <iostream>
  8   using   namespace   std;
   9  
 10   void  print( int   x)
  11   {
  12      cout << x <<  "      "  ;
  13   }
  14  
 15   int   main()
  16   {
  17       //   初始化向量v 
 18      vector< int >   v;
  19      v.push_back( 1  );
  20      v.push_back( 3  );
  21      v.push_back( 5  );
  22  
 23       //   初始化双向链表l 
 24      list< int >  l;
  25      l.push_back( 2  );
  26      l.push_back( 4  );
  27      l.push_back( 6  );
  28      l.push_back( 8  );
  29      l.push_back( 10  );
  30  
 31       //   复制v到l 
 32       copy(v.begin(), v.end(), l.begin());
  33  
 34       //   打印链表l中的元素 
 35       for_each(l.begin(), l.end(), print);
  36      cout <<  endl;
  37  
 38       return   0  ;
  39  }

应用 copy_backward 算法在同一个向量vector中进行复制

 1   /*      下面示例程序将{1 2 3 4 5 6 7 8 9 10}向量的前3个元素复制到后面3个元素中,打印输出为“1 2 3 4 5 6 7 1 2 3 ”,与采用 copy 算法复制的打印输出完全相同,只是元素的复制顺序不同
   2   */ 
  3  -----------------------------------------------  应用 copy_backward 算法在同一个向量vector中进行复制
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  '      '  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int > v( 10  );
  17       //   初始化复制 
 18       for  (unsigned  int  i= 0 ; i<v.size(); i++ )
  19          v[i] = i+ 1  ;
  20       //   将v向量的前3个元素复制到后面3个元素中 
 21      copy_backward(v.begin(), v.begin()+ 3  , v.end());
  22  
 23       for_each(v.begin(), v.end(), print);
  24      cout <<  endl;
  25  
 26       return   0  ;
  27  }

应用 swap 算法交换两个整型变量

 1   /*      下面示例程序将整数 a=5 和 b=26 交换,结果当然为 a=26 和 b=5
   2   */ 
  3  -----------------------------------------------  应用 swap 算法交换两个整型变量
   4  #include <algorithm>
  5  #include <iostream>
  6   using   namespace   std;
   7   int   main()
   8   {
   9       int  a =  5  ;
  10       int  b =  26  ;
  11      cout <<  "  交换前  "  <<  "  a =   "  << a <<  "    b =   "  << b << endl <<  endl;
  12       //   交换 
 13       swap(a,b);
  14      cout <<  "  交换后  "  <<  "  a =   "  << a <<  "    b =   "  << b <<  endl;
  15  
 16       return   0  ;
  17  }

应用 iter_swap 算法交换两个整型变量

 1   /*      下面示例程序简单地讲标准整数类型的 a 和 b,调用 iter_swap 算法进行交换
   2   */ 
  3  ----------------------------------------------- 
  4  #include <algorithm>
  5  #include <iostream>
  6   using   namespace   std;
   7   int   main()
   8   {
   9       int  a =  5  ;
  10       int  b =  6  ;
  11      cout <<  "  交换前 a=  "  << a <<  "  , b=  "  << b << endl <<  endl;
  12       //   交换 
 13      iter_swap(&a, & b);
  14      cout <<  "  交换后 a=  "  << a <<  "  , b=  "  << b << endl <<  endl;
  15  
 16       return   0  ;
  17  }

应用 swap_ranges 算法交换两个 vector 容器元素

 1   /*      下面示例程序将两个向量容器 v1 和 v2 的元素交换,打印输出为“交换前,v1=1 3 5  v2=2 4 6交换后,v1=2 4 6  v2=1 3 5”
   2   */ 
  3  -----------------------------------------------  应用 swap_ranges 算法交换两个 vector 容器元素
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int >  v1, v2;
  17      v1.push_back( 1  );
  18      v1.push_back( 3  );
  19      v1.push_back( 5  );
  20      v2.push_back( 2  );
  21      v2.push_back( 4  );
  22      v2.push_back( 6  );
  23  
 24       //   打印v1, v2 
 25      cout <<  "  交换前, v1=   "  ;
  26       for_each(v1.begin(), v1.end(), print);
  27      cout <<  endl;
  28  
 29      cout <<  "  交换前, v2=   "  ;
  30       for_each(v2.begin(), v2.end(), print);
  31      cout <<  endl;
  32  
 33       //   交换 v1, v2 
 34       swap_ranges(v1.begin(), v1.end(), v2.begin());
  35  
 36       //   打印 v1, v2 
 37      cout <<  endl;
  38      cout <<  "  交换后, v1=   "  ;
  39       for_each(v1.begin(), v1.end(), print);
  40      cout <<  endl;
  41  
 42      cout <<  "  交换后, v2=   "  ;
  43       for_each(v2.begin(), v2.end(), print);
  44      cout <<  endl;
  45  
 46       return   0  ;
  47  }

应用 transform 算法对 vector 容器元素进行平方计算

 1   /*      下面示例程序将向量 v 的元素 5、15和25,执行平方变换,结果放入双向链表l 中,打印输出为“25 225 625”
   2   */ 
  3  -----------------------------------------------  应用 transform 算法对 vector 容器元素进行平方计算
   4  #include <algorithm>
  5  #include <vector>
  6  #include <list>
  7  #include <iostream>
  8   using   namespace   std;
   9  
 10   int  square( int   x)
  11   {
  12       return  x* x;
  13   }
  14  
 15   void  print( int   x)
  16   {
  17      cout << x <<  "    "  ;
  18   }
  19  
 20   int   main()
  21   {
  22       //   vector 初始化 
 23      vector< int >  v;
  24      v.push_back( 5  );
  25      v.push_back( 15  );
  26      v.push_back( 25  );
  27  
 28       //   list 初始化 
 29      list< int > l( 3  );
  30  
 31       //   对vector容器元素执行平方运算,放入 list 容器 
 32       transform(v.begin(), v.end(), l.begin(), square);
  33  
 34       //   打印链表元素 
 35       for_each(l.begin(), l.end(), print);
  36      cout <<  endl;
  37  
 38       return   0  ;
  39  }

应用 replace 算法替换向量和数组元素

 1   /*      下面示例程序先将变量 v={13, 25, 27, 25, 29} 的元素25替换为 100,然后,再将数组 iArray[]={3, 6, 5, 9, 5, 5, 10}的元素5替换为200,打印"v向量元素:13 100 27 100 29   数组iArray元素:3 6 200 9 200 200 10"
   2   */ 
  3  -----------------------------------------------  应用 replace 算法替换向量和数组元素
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int >   v;
  17      v.push_back( 13  );
  18      v.push_back( 25  );
  19      v.push_back( 27  );
  20      v.push_back( 25  );
  21      v.push_back( 29  );
  22  
 23       //   将v的25全部替换为100 
 24      replace(v.begin(), v.end(),  25 ,  100  );
  25      cout <<  "  v向量元素:  "  ;
  26       for_each(v.begin(), v.end(), print);
  27      cout <<  endl;
  28  
 29       //   将iArray的5全部替换为200 
 30       int  iArray[ 7 ] = { 3 ,  6 ,  5 ,  9 ,  5 ,  5 ,  10  };
  31      replace(iArray, iArray+ 7 ,  5 ,  200  );
  32      cout <<  "  数组iArray元素:  "  ;
  33      for_each(iArray, iArray+ 7  , print);
  34      cout <<  endl;
  35  
 36       return   0  ;
  37  }

应用 replace_if 算法替换向量中奇数值的元素

应用 replace_copy 算法将值为1的元素替换后拷贝到新容器

 1   /*      下面示例程序将向量 v={0, 1, 2, 3, 4, 5, 6, 0, 1, 2}的奇数元素替换为新值38,打印输出为“0 38 2 38 4 38 6 0 38 2”
   2   */ 
  3  -----------------------------------------------  应用 replace_if 算法替换向量中奇数值的元素
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   bool  odd( int   x)
  10   {
  11       return  x %  2  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int > v( 10  );
  17      unsigned  int   i;
  18       for  (i= 0 ; i<v.size(); i++ )
  19       {
  20          v[i] = i %  7  ;
  21          cout << v[i] <<  "    "   ;
  22       }
  23      cout <<  endl;
  24  
 25       //   将奇数元素替换为38 
 26      replace_if(v.begin(), v.end(), odd,  38  );
  27       for  (i= 0 ; i<v.size(); i++ )
  28          cout << v[i] <<  "    "  ;
  29  
 30      cout <<  endl;
  31  
 32       return   0  ;
  33  }

应用 replace_copy_if 算法将奇数元素替换后拷贝到新容器

 1   /*      下面的示例程序将链表l1={1, 3, 1, 6, 8}中值为1 的元素替换为100后,拷贝到链表l2中。打印输出为“l1保持不变:1 3 1 6 8   l2元素为:100 3 100 6 8”
   2   */ 
  3  -----------------------------------------------  应用 replace_copy 算法将值为1的元素替换后拷贝到新容器
   4  #include <algorithm>
  5  #include <list>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16      list< int >  l1;
  17      l1.push_back( 1  );
  18      l1.push_back( 3  );
  19      l1.push_back( 1  );
  20      l1.push_back( 6  );
  21      l1.push_back( 8  );
  22  
 23       //   将l1链表元素1替换为 100,然后拷贝到l2链表 
 24      list< int >  l2( 5  );
  25      replace_copy(l1.begin(), l1.end(), l2.begin(),  1 ,  100  );
  26      cout <<  "  l1 保持不变:  "  ;
  27       for_each(l1.begin(), l1.end(), print);
  28      cout <<  endl;
  29      cout <<  "  l2 元素为:  "  ;
  30       for_each(l2.begin(), l2.end(), print);
  31      cout <<  endl;
  32  
 33       return   0  ;
  34  }

应用 fill 算法容器填充向量容器

  1   /*      下面示例程序将向量 v={0, 1, 2, 3, 4, 5, 6, 0, 1, 2}中奇数值元素替换为38,然后拷贝到链表l中,链表的打印输出为“0 38 2 38 4 38 6 0 38 2”,向量v的元素不变
   2   */ 
  3  -----------------------------------------------  应用 replace_copy_if 算法将奇数元素替换后拷贝到新容器
   4  #include <algorithm>
  5  #include <vector>
  6  #include <list>
  7  #include <iostream>
  8   using   namespace   std;
   9  
 10   bool  odd( int   x)
  11   {
  12       return  x %  2  ;
  13   }
  14  
 15   int   main()
  16   {
  17      vector< int > v( 10  );
  18      unsigned  int   i;
  19       for  (i= 0 ; i<v.size(); i++ )
  20       {
  21          v[i] = i %  7  ;
  22          cout << v[i] <<  "    "  ;
  23       }
  24      cout <<  endl;
  25  
 26       //   将向量v中奇数元素替换为38后拷贝到链表l 
 27      list< int > l( 10  );
  28      replace_copy_if(v.begin(), v.end(), l.begin(), odd,  388  );
  29      list< int > ::iterator list_iter;
  30       for  (list_iter=l.begin(); list_iter!=l.end(); ++ list_iter)
  31          cout << *list_iter <<  "    "  ;
  32      cout <<  endl;
  33  
 34       return   0  ;
  35  }

应用 fill_n 算法填充向量容器

 1   /*      下面示例程序将向量的5个元素的值全部填充为30,打印输出为“30 30 30 30 30 ”
   2   */ 
  3  -----------------------------------------------  应用 fill 算法容器填充向量容器
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int > v( 5  );
  17      fill(v.begin(), v.end(),  30  );
  18       for_each(v.begin(), v.end(), print);
  19      cout <<  endl;
  20  
 21       return   0  ;
  22  }

应用 generate 算法将一个数列生成到向量容器

 1   /*      下面示例程序将向量v的前5个元素填充为2,打印输出为“2 2 2 2 2 1 1 1 ”。然后再全部填充为3,打印输出“3 3 3 3 3 3 3 3 ”
   2   */ 
  3  -----------------------------------------------  应用 fill_n 算法填充向量容器
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int >  v( 8  );
  17      fill(v.begin(), v.end(),  1  );
  18  
 19       //   前5个元素填充为2 
 20      fill_n(v.begin(),  5 ,  2  );
  21       for_each(v.begin(), v.end(), print);
  22      cout <<  endl;
  23  
 24       //   全部为3 
 25      fill_n(v.begin(), v.size(),  3  );
  26       for_each(v.begin(), v.end(), print);
  27      cout <<  endl;
  28  
 29       return   0  ;
  30  }

应用 generate_n 算法将3个伪随机数生成到向量容器

 1   /*      下面示例程序定义了一个 sequence 类,构造出等差数列 ,然后调用generate算法,将等差数列写入向量容器V,打印输出为“3 6 9 12 15 18 21 24 27 30”
   2   */ 
  3  -----------------------------------------------  应用 generate 算法将一个数列生成到向量容器
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   //   等差数列 an+1=an+3 
 10   class   sequence
  11   {
  12   public  :
  13       int   a;
  14      sequence(){a= 0  ;}
  15      inline  int   operator  ()()
  16       {
  17          a = a +  3  ;
  18           return   a;
  19       }
  20   };
  21  
 22   void  print( int   x)
  23   {
  24      cout << x <<  "    "  ;
  25   }
  26  
 27   int   main()
  28   {
  29      vector< int > v( 10  );
  30       sequence an;
  31       generate(v.begin(), v.end(), an);
  32       for_each(v.begin(), v.end(), print);
  33      cout <<  endl;
  34  
 35       return   0  ;
  36  }

应用 remove_copy 算法将向量容器不包含4的元素拷贝到数组

 1   /*      下面示例程序使用C标准函数 rand,将3个伪随机数生成到向量容器v中,打印输出。
   2   */ 
  3  -----------------------------------------------  应用 generate_n 算法将3个伪随机数生成到向量容器
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   int   main()
  10   {
  11      vector< int > v( 10  );
  12       //   生成3个伪随机数 
 13      generate_n(v.begin(),  3  , rand);
  14       for  (unsigned  int  i= 0 ; i<v.size(); i++ )
  15          cout << v[i] <<  "    "  ;
  16  
 17      cout <<  endl;
  18  
 19       return   0  ;
  20  }

应用 remove_copy_if 算法将向量容器中奇数元素拷贝到数组

 1   /*      下面示例程序将向量 v={2, 4, 3, 4, 8}中不等于4的元素复制到数组iArray,v的打印输出为“2, 4, 3, 4, 8”,维持不变;iArray数组的打印输出为"2 3 8 0 0 0",已不包含值为4的元素
   2   */ 
  3  -----------------------------------------------  应用 remove_copy 算法将向量容器不包含4的元素拷贝到数组
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13   int   main()
  14   {
  15      vector< int >   v;
  16      v.push_back( 2  );
  17      v.push_back( 4  );
  18      v.push_back( 3  );
  19      v.push_back( 4  );
  20      v.push_back( 8  );
  21  
 22       //   初始化数组 
 23       int  iArray[ 6 ] = { 0  };
  24  
 25       //   移|除 复制,v不变, 
 26      remove_copy(v.begin(), v.end(), iArray,  4  );
  27       for_each(v.begin(), v.end(), print);
  28      cout <<  endl;
  29  
 30       //   打印数组 
 31      for_each(iArray, iArray+ 6  , print);
  32      cout <<  endl;
  33  
 34       return   0  ;
  35  }

应用 remove 算法将向量容器中的某值元素移除

 1   /*      下面示例程序将向量v={7, 2, 5, 4, 1}中不是偶数的元素复制到数组iArray,v 的打印输出为“7, 2, 5, 4, 1”维持不变;iArray数组的打印输出为"7 5 1 0 0 0"
   2   */ 
  3  -----------------------------------------------  应用 remove_copy_if 算法将向量容器中奇数元素拷贝到数组
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   bool  even( int   x)
  15   {
  16       return  x %  2  ?  0  :  1  ;
  17   }
  18  
 19   int   main()
  20   {
  21      vector< int >   v;
  22      v.push_back( 7  );
  23      v.push_back( 2  );
  24      v.push_back( 5  );
  25      v.push_back( 4  );
  26      v.push_back( 1  );
  27      
 28       //   初始化数组 
 29       int  iArray[ 6 ]={ 0  };
  30      
 31       //   移除 v 中偶数,剩余元素 
 32       remove_copy_if(v.begin(), v.end(), iArray, even);
  33  
 34       //   打印v, v 没有变 
 35       for_each(v.begin(), v.end(), print);
  36      cout << endl <<  endl;
  37  
 38       //   打印iArray 
 39      for_each(iArray, iArray+ 6  , print);
  40      cout <<  endl;
  41  
 42  
 43       return   0  ;
  44  }

应用 remove_if 算法将向量容器中偶数移除

  1   /*      下面示例程序将向量 v={7, 2, 5, 4, 1}中偶数移除,结果迭代器区间[first, result)的元素为{7, 5, 1};而向量v={7, 5, 1, 4, 1},后面两个元素{4, 1}是v保留下来的元素。
   2   */ 
  3  -----------------------------------------------  应用 remove_if 算法将向量容器中偶数移除
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   //   偶数 
 15   bool  even( int   x)
  16   {
  17       return  x %  2  ?  0  :  1  ;
  18   }
  19  
 20   int   main()
  21   {
  22       //   初始化向量v 
 23      vector< int >   v;
  24      v.push_back( 7  );
  25      v.push_back( 2  );
  26      v.push_back( 5  );
  27      v.push_back( 4  );
  28      v.push_back( 1  );
  29      
 30       //   移除偶数 
 31      vector< int >::iterator  result =  remove_if(v.begin(), v.end(), even);
  32  
 33       //   打印 7 5 1 
 34       for_each(v.begin(), result, print);
  35      cout << endl <<  endl;
  36  
 37       //   打印 7 5 1 4 1 
 38       for_each(v.begin(), v.end(), print);
  39      cout <<  endl;
  40  
 41       return   0  ;
  42  }

 1   /*      下面示例程序将向量容器v={2, 4, 3, 4, 8}中元素4全部移除掉,于是,迭代区间[first, result)的元素为{2, 3, 8},没有元素等于4.而v变为{2, 3, 8, 4, 8},前面3个元素就是复制过去的,后面的两个元素(包括4)是原向量中的元素(这里需要仔细思考了)
   2   */ 
  3  -----------------------------------------------  应用 remove 算法将向量容器中的某值元素移除
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16       //   初始化向量 v 
 17      vector< int >   v;
  18      v.push_back( 2  );
  19      v.push_back( 4  );
  20      v.push_back( 3  );
  21      v.push_back( 4  );
  22      v.push_back( 8  );
  23  
 24       //   移除4 
 25      vector< int >::iterator  result = remove(v.begin(), v.end(),  4  );
  26  
 27       //   打印 2 3 8 
 28       for_each(v.begin(), result, print);
  29      cout << endl <<  endl;
  30  
 31       //   打印 4 8 
 32       for_each(result, v.end(), print);
  33      cout << endl <<  endl;
  34  
 35       //   打印 2 3 8 4 8 
 36       for_each(v.begin(), v.end(), print);
  37      cout <<  endl;
  38  
 39       return   0  ;
  40  }

应用 unique_copy 算法唯一复制向量容器元素

 1   /*      下面示例程序将向量 v={2, 5, 5, 5, 6, 5, 2}中连续3个5的元素剔除两个,复制到iArray数组。打印输出为“2 5 6 5 2 0”
   2   */ 
  3  -----------------------------------------------  应用 unique_copy 算法唯一复制向量容器元素
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int >   v;
  17      v.push_back( 2  );
  18      v.push_back( 5  );
  19      v.push_back( 5  );
  20      v.push_back( 5  );
  21      v.push_back( 6  );
  22      v.push_back( 5  );
  23      v.push_back( 2  );
  24  
 25       int  iArray[ 6 ] = { 0  };
  26       unique_copy(v.begin(), v.end(), iArray);
  27  
 28       //   打印 2 5 6 5 2 0 
 29      for_each(iArray, iArray+ 6  , print);
  30      cout <<  endl;
  31  
 32       return   0  ;
  33  }

应用 unique 算法剔除向量容器的连续重复元素

 1   /*      下面示例程序将向量 v={2, 6, 6, 6, 9, 6, 3}的3个连续元素6剔除(仅保留1个),结果[first, result)元素为{2, 6, 9, 6, 3},而向量v的元素变为{2, 6, 9, 6, 3, 6, 3},最后的两个元素{6, 3}是原来向量容器保留下来的元素
   2   */ 
  3  -----------------------------------------------  应用 unique 算法剔除向量容器的连续重复元素
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int >   v;
  17      v.push_back( 2  );
  18      v.push_back( 6  );
  19      v.push_back( 6  );
  20      v.push_back( 6  );
  21      v.push_back( 9  );
  22      v.push_back( 6  );
  23      v.push_back( 3  );
  24      vector< int >::iterator  result =  unique(v.begin(), v.end());
  25  
 26       //   打印 2 6 9 6 3 
 27       for_each(v.begin(), result, print);
  28      cout << endl <<  endl;
  29  
 30       //   打印 2 6 9 6 3 6 3  
 31       for_each(v.begin(), v.end(), print);
  32      cout <<  endl;
  33  
 34       return   0  ;
  35  }

应用 reverse 算法将向量容器的元素反向排列

 1   /*      下面示例程序将向量 v={0, 1, 2, 3, 4, 5, 6, 7, 8, 9},反向排列为 v={9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
   2   */ 
  3  -----------------------------------------------  应用 reverse 算法将向量容器的元素反向排列
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int >  v( 10  );
  17       for  (size_t i= 0 ; i<v.size(); i++ )
  18          v[i] =  i;
  19  
 20       for_each(v.begin(), v.end(), print);
  21      cout << endl <<  endl;
  22  
 23       reverse(v.begin(), v.end());
  24       for_each(v.begin(), v.end(), print);
  25      cout <<  endl;
  26  
 27  
 28       return   0  ;
  29  }

应用 reverse_copy 算法反向复制向量容器元素到数组

 1   /*      下面示例程序将向量 v={0, 1, 2, 3, 4, 5, 6, 7, 8, 9},反向复制到数组iArray,打印iArray为“9 8 7 6 5 4 3 2 1 0”
   2   */ 
  3  -----------------------------------------------  应用 reverse_copy 算法反向复制向量容器元素到数组
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int >  v( 10  );
  17       for (size_t i= 0 ; i<v.size(); i++ )
  18          v[i] =  i;
  19  
 20       int  iArray[ 10 ] = { 0  };
  21       reverse_copy(v.begin(), v.end(), iArray);
  22      for_each(iArray, iArray+ 10  , print);
  23      cout <<  endl;
  24  
 25       return   0  ;
  26  }

应用 rotate 算法旋转向量容器元素

  1   /*      下面示例程序旋转向量容器 v={1, 2, 3, 4, 5, 6, 7, 8, 9, 10},middle支点选为整数8,旋转后打印输出为“8 9 10 1 2 3 4 5 6 7 ”
   2   */ 
  3  -----------------------------------------------  应用 rotate 算法旋转向量容器元素
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int >  v( 10  );
  17       for  (size_t i= 0 ; i<v.size(); i++ )
  18          v[i] = i+ 1  ;
  19       for_each(v.begin(), v.end(), print);
  20      cout << endl <<  endl;
  21  
 22       //   旋转  
 23      cout <<  "  开始旋转,middle元素=  "  << *(v.begin() +  7 ) <<  endl;
  24      rotate(v.begin(), v.begin()+ 7  , v.end());
  25       for_each(v.begin(), v.end(), print);
  26      cout <<  endl;
  27  
 28       return   0  ;
  29  }

应用 rotate_copy 算法旋转复制向量容器元素到数组

 1   /*      下面示例程序旋转复制向量容器 v={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}到数组iArray,middle支点选为整数8,iArray的打印输出为“8 9 10 1 2 3 4 5 6 7 ”
   2   */ 
  3  -----------------------------------------------  应用 rotate_copy 算法旋转复制向量容器元素到数组
   4  #include <algorithm>
  5  #include <vector>
  6  #include <iostream>
  7   using   namespace   std;
   8  
  9   void  print( int   x)
  10   {
  11      cout << x <<  "    "  ;
  12   }
  13  
 14   int   main()
  15   {
  16      vector< int >  v( 10  );
  17       for (size_t i= 0 ; i<v.size(); i++ )
  18          v[i] = i + 1  ;
  19  
 20       int  iArray[ 10 ] = { 0  };
  21      cout <<  "  开始旋转复制,*middle 选为   "  << *(v.begin()+ 7 ) <<  endl;
  22      rotate_copy(v.begin(), v.begin()+ 7  , v.end(), iArray);
  23      for_each(iArray, iArray+ 10  , print);
  24      cout <<  endl;
  25  
 26       return   0  ;
  27  }

应用 random_shuffle 算法随机抖动向量容器的元素

  1   /*      对容器内的元素进行随机的排序
   2   */ 
  3  -----------------------------------------------  应用 random_shuffle 算法随机抖动向量容器的元素
   4  #include <algorithm>
  5  #include <iostream>
  6   using   namespace   std;
   7  
  8   void  print( int   x)
   9   {
  10      cout << x <<  "    "  ;
  11   }
  12  
 13   int   main()
  14   {
  15       int  iArray[ 10 ] = { 1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 ,  10  };
  16      cout <<  "  随机抖动iArray三次  "  <<  endl;
  17       for  ( int  i= 0 ; i< 3 ; i++ )
  18       {
  19          random_shuffle(iArray, iArray+ 10  );
  20          for_each(iArray, iArray+ 10  , print);
  21          cout << endl <<  endl;
  22       }
  23  
 24       return   0  ;
  25  }

应用 partition 算法分割数组

 1   /*      下面示例程序,将数组iArray 稳定分割为小于10 和不小于10两部分。
   2   */ 
  3  -----------------------------------------------  应用 stable_partition 算法稳定分割数组
   4  #include <algorithm>
  5  #include <iostream>
  6   using   namespace   std;
   7  
  8   void  print( int   x)
   9   {
  10      cout << x <<  "    "  ;
  11   }
  12  
 13   bool  less10( int   x)
  14   {
  15       return  x <  10  ?  1  :  0  ;
  16   }
  17  
 18   int   main()
  19   {
  20       int  iArray[ 10 ] = { 16 , - 1 ,  3 ,  11 ,  2 ,  5 ,  8 ,  20 ,  9 ,  3  };
  21      for_each(iArray, iArray+ 10  , print);
  22      cout << endl <<  endl;
  23  
 24       //   进行稳定分割 
 25       int  *result = stable_partition(iArray, iArray+ 10  , less10);
  26      cout <<  "  按小于10稳定分割,iArray数组变为:  " <<  endl;
  27      for_each(iArray, iArray+ 10  , print);
  28      cout << endl <<  endl;
  29  
 30      cout <<  "  iArray 数组有如下小于10 的整数:   "  <<  endl;
  31       for_each(iArray, result, print);
  32      cout <<  endl;
  33  
 34      cout <<  "  stable_partition算法返回的分界元素为:  "  << *result <<  endl;
  35  
 36       return   0  ;
  37  }

应用 stable_partition 算法稳定分割数组

 1   /*      下面示例程序将数组 iArray={16, -1, 3, 11, 2, 5, 8, 20, 9, 3},分割成小于10和不小于10两部分。
   2   */ 
  3  -----------------------------------------------  应用 partition 算法分割数组
   4  #include <algorithm>
  5  #include <iostream>
  6   using   namespace   std;
   7  
  8   void  print( int   x)
   9   {
  10      cout << x <<  "    "  ;
  11   }
  12  
 13   //   小于10 
 14   bool  less10( int   x)
  15   {
  16       return  x <  10  ?  1  :  0   ;
  17   }
  18  
 19   int   main()
  20   {
  21       int  iArray[ 10 ] = { 16 , - 1 ,  3 ,  11 ,  2 ,  5 ,  8 ,  20 ,  9 ,  3  };
  22       int  *result = partition(iArray, iArray+ 10  , less10);
  23      cout <<  "  按小于10进行分割:   "  <<  endl;
  24      for_each(iArray, iArray+ 10  , print);
  25      cout <<  endl;
  26      cout <<  "  partition算法返回的分界元素为:  "  << *result <<  endl;
  27  
 28       return   0  ;
  29  }

 
------------------------- 变易算法小结
    在C++ STL 算法库中,收集了一些会使操作数发生改变的常用算法,称为变易算法。
    包括元素复制 copy/copy_backward 算法
    两元素交换的 swap/iter_swap/swap_ranges 算法
    进行元素变换的 transform 算法
    元素替换处理的 replace/replace_if/replace_copy/replace_copy_if 算法
    填充元素值的 fill/fill_n 算法
    生成随机元素值的 generate/generate_n 算法
    移除处理的 remove_copy/remove_copy_if/remove/remove_if 算法
    剔除重复元素的 unique_copy/unique 算法
    反向处理的 reverse/reverse_copy 算法
    旋转处理的 rotate/totate_copy 算法
    随机抖动的 random_shuffle 算法
    容器分割的 partition/stable_partition 算法

 ===========================分享一个文件: STL帮助文档 ======================

作者: Music__Liang

出处: http://www.cnblogs.com/music-liang/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于STL学习笔记变易算法的详细内容...

  阅读:43次

上一篇: 本页使用的CSS

下一篇:欧拉公式