C++ STL算法transform

参考:《C++ Primer》以及教学视频


所有容器适用


transform(b1,e1,b2,op)      //把一个区间[b1,e1)内的数据经过(op)转化,放入第二个容器内

                            //也就是复制+修改(变换)    当然b2可以等于b1
transform(b1,e1,b2,b3,op)   //把两个集合里的数据整合(op)到第三个集合,当然b3=b2=b1也可以

注意:
    1、如果目标与源相同,transform()就和for_each()一样
    2、如果想以某值替换符合规则的元素,应使用replace()算法


[cpp]  view plain  copy
  1. /**------http://blog.csdn.net/u010579068------**/  
  2. #include<iostream>  
  3. #include<cstdio>  
  4. #include<string>  
  5. #include<vector>  
  6. #include<list>  
  7. #include<deque>  
  8. #include<iterator>  
  9. #include<algorithm>  
  10. using namespace std;  
  11. /***************************************** 
  12. //所有容器适用 
  13. transform(b1,e1,b2,op)      //把一个区间[b1,e1)内的数据经过(op)转化,放入第二个容器内 
  14.                             //也就是复制+修改(变换)    当然b2可以等于b1 
  15. transform(b1,e1,b2,b3,op)   //把两个集合里的数据整合(op)到第三个集合,当然b3=b2=b1也可以 
  16.  
  17. 注意: 
  18.     1、如果目标与源相同,transform()就和for_each()一样 
  19.     2、如果想以某值替换符合规则的元素,应使用replace()算法。 
  20. *****************************************/  
  21. /**---------------------------------------------------------------------------------- 
  22. 预定义的函数对象 
  23. negate<type>()       *(-1)              equal_to<type>()         == 
  24. plus<type>()         +                  not_equal_to<type>()     != 
  25. minus<type>()        -                  less<type>()              < 
  26. multiplies<type>()   *                  greater<type>()          > 
  27. divides<type>()      /                  less_equal<type>()        <= 
  28. modulus<type>()      %                  greater_equal<type>()    >= 
  29.                                         logical_not<type>()       ! 
  30.                                         logical_and<type>()      && 
  31.                                         logical_or<type>()       || 
  32. ----------------------------------------------------------------------------------**/  
  33. /************************************************************************************* 
  34. std::transform                     所有排序容器适用                          algorithm 
  35. -------------------------------------------------------------------------------------- 
  36. template < class InputIterator, class OutputIterator, class UnaryOperator > 
  37.   OutputIterator transform ( InputIterator first1, InputIterator last1, 
  38.                              OutputIterator result, UnaryOperator op ); 
  39.  
  40. template < class InputIterator1, class InputIterator2, 
  41.            class OutputIterator, class BinaryOperator > 
  42.   OutputIterator transform ( InputIterator1 first1, InputIterator1 last1, 
  43.                              InputIterator2 first2, OutputIterator result, 
  44.                              BinaryOperator binary_op ); 
  45.  
  46. //eg: 
  47. template < class InputIterator, class OutputIterator, class UnaryOperator > 
  48.   OutputIterator transform ( InputIterator first1, InputIterator last1, 
  49.                              OutputIterator result, UnaryOperator op ) 
  50. { 
  51.   while (first1 != last1) 
  52.     *result++ = op(*first1++);  // or: *result++=binary_op(*first1++,*first2++); 
  53.   return result; 
  54. } 
  55. *************************************************************************************/  
  56.   
  57. template<typename T>  
  58. void Print(const T& V)  
  59. {  
  60.     typename T::const_iterator iter = V.begin();  
  61.     while(iter != V.end())  
  62.         cout<<*iter++<<" ";  
  63.     cout<<endl;  
  64. }  
  65.   
  66. int main()  
  67. {  
  68.     vector<int> ivec;  
  69.     list<int> ilist;  
  70.   
  71.     for(int i=1;i<=9;i++)  
  72.         ivec.push_back(i);  
  73.     ivec.push_back(-10);  
  74.     vector<int>::iterator iv=ivec.begin();  
  75.     while(iv != ivec.end()) cout<<*iv++<<" ";  
  76.     cout<<endl;  
  77.   
  78.     //利用预定于函数对本身修改----------------------符号取反  
  79.     transform(ivec.begin(),ivec.end(),ivec.begin(),negate<int>());  
  80.     Print(ivec);  
  81.   
  82.     //存入list并修改原数据(*10) -----利用bind2nd(muliplies<int>(),10)  
  83.     transform(ivec.begin(),ivec.end(),back_inserter(ilist),  
  84.               bind2nd(multiplies<int>(),10));  
  85.     Print(ilist);  
  86.     //利用transform和输出流 符号取反输出  
  87.     transform(ilist.begin(),ilist.end(),ostream_iterator<int>(cout," "),negate<int>());  
  88.     cout<<endl;  
  89. /**------------------------------------------------------------------------------------**/  
  90.     //transform(b1,e1,b2,b3,op)  
  91.     //三个容器间的~  
  92.     //1、三个容器都是自己本身  
  93.     transform(ilist.begin(),ilist.end(),ilist.begin(),ilist.begin(),multiplies<int>());  
  94.     Print(ilist);  
  95.     //2、用两个容器,结果放入另一个容器||输出  
  96.     transform(ivec.begin(),ivec.end(),ilist.rbegin(),ostream_iterator<int>(cout," "),plus<int>());  
  97.     cout<<endl;  
  98.     transform(ivec.begin(),ivec.end(),ilist.rbegin(),ivec.begin(),plus<int>());  
  99.     Print(ivec);  
  100.   
  101.     return 0;  
  102. }  
  103. /******* 
  104. Output: 
  105.     1 2 3 4 5 6 7 8 9 -10 
  106.     -1 -2 -3 -4 -5 -6 -7 -8 -9 10 
  107.     -10 -20 -30 -40 -50 -60 -70 -80 -90 100 
  108.     10 20 30 40 50 60 70 80 90 -100 
  109.     100 400 900 1600 2500 3600 4900 6400 8100 10000 
  110.     9999 8098 6397 4896 3595 2494 1593 892 391 110 
  111.     9999 8098 6397 4896 3595 2494 1593 892 391 110 
  112.  
  113. **/  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值