简单的程序诠释C++ STL算法系列之十四:copy_backward

原文链接:http://blog.csdn.net/jerryjbiao/article/details/7381498


  前文中展示了copy的魅力,现在我们来看一下它的孪生兄弟copy_backward,copy_backward算法与copy在行为方面相似,只不过它的复制过程与copy背道而驰,其复制过程是从最后的元素开始复制,直到首元素复制出来。也就是说,复制操作是从last-1开始,直到first结束。这些元素也被从后向前复制到目标容器中,从result-1开始,一直复制last-first个元素。举个简单的例子:已知vector {0, 1, 2, 3, 4, 5},现我们需要把最后三个元素(3, 4, 5)复制到前面三个(0, 1, 2)位置中,那我们可以这样设置:将first设置值3的位置,将last设置为5的下一个位置,而result设置为3的位置,这样,就会先将值5复制到2的位置,然后4复制到1的位置,最后3复制到0的位置,得到我们所要的序列{3, 4, 5, 3, 4, 5}。下面我们来看一下copy_backward的函数原型:

函数原型:

[cpp]  view plain copy
  1. template<class BidirectionalIterator1, class BidirectionalIterator2>  
  2.  BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,  
  3.                                         BidirectionalIterator1 last,  
  4.                                         BidirectionalIterator2 result);   

 参数:

       first, last 
       指出被复制的元素的区间范围[first,last). 
       result 
       指出复制到目标区间的具体位置[result-(last-first),result)

 返回值:

        返回一个迭代器,指出已被复制元素区间的起始位置

 程序示例:

      先通过一个简单的示例来阐述copy_backward的使用方法,程序比较简单,代码中做了详细的说明,在此不再累赘。

[cpp]  view plain copy
  1. /******************************************************************* 
  2.  * Copyright (C) Jerry Jiang 
  3.  *                
  4.  * File Name   : copy_backward.cpp 
  5.  * Author      : Jerry Jiang 
  6.  * Create Time : 2012-3-21 23:14:57 
  7.  * Mail        : jbiaojerry@gmail.com 
  8.  * Blog        : http://blog.csdn.net/jerryjbiao  
  9.  *                
  10.  * Description :  简单的程序诠释C++ STL算法系列之十四                   
  11.  *                变易算法 : 反向复制copy_backward  
  12.  *                
  13.  ******************************************************************/  
  14.   
  15. #include <iostream>  
  16. #include <algorithm>  
  17. #include <vector>  
  18.   
  19. using namespace std;  
  20.   
  21. int main()  
  22. {  
  23.     vector<int> myvector;  
  24.     vector<int>::iterator iter;  
  25.   
  26.     //为容器myvector赋初始值:10 20 30 40 50  
  27.     for ( int i = 1; i <= 5; ++i )  
  28.     {  
  29.         myvector.push_back( i*10 );  
  30.     }  
  31.   
  32.     //将myvector容器的大小增加3个单元  
  33.     myvector.resize( myvector.size()+3 );  
  34.   
  35.     //将容器元素20、10拷贝到第八、第七个单元中:10 20 30 40 50 0 10 20  
  36.     //注意copy_backward是反向复制,先将20拷贝到第八个单元,再将10拷贝到第七个单元  
  37.     copy_backward( myvector.begin(), myvector.begin()+2, myvector.end() );  
  38.   
  39.     for ( iter = myvector.begin(); iter != myvector.end(); ++iter )  
  40.     {  
  41.         cout << " " << *iter;  
  42.     }  
  43.   
  44.     cout << endl;  
  45.   
  46.   
  47.     //清除myvector容器  
  48.     myvector.clear();  
  49.   
  50.     //还原容器myvector的初始值:10 20 30 40 50  
  51.     for ( i = 1; i <= 5; ++i )  
  52.     {  
  53.         myvector.push_back( i*10 );  
  54.     }  
  55.   
  56.     //将容器元素40、50覆盖10、20, 即:40 50 30 40 50:  
  57.     copy_backward( myvector.end()-2, myvector.end(), myvector.end()-3 );  
  58.       
  59.     for ( iter = myvector.begin(); iter != myvector.end(); ++iter )  
  60.     {  
  61.         cout << " " << *iter;  
  62.     }  
  63.       
  64.     cout << endl;  
  65.     return 0;  
  66. }  


     通过上例的简单介绍相信大家对copy_backward 的基本使用不再陌生了吧,^_^,下面我们结合前面所讲的for_search算法来巩固一下copy_backward的使用。

[cpp]  view plain copy
  1. /******************************************************************* 
  2.  * Copyright (C) Jerry Jiang 
  3.  *                
  4.  * File Name   : copy_backward02.cpp 
  5.  * Author      : Jerry Jiang 
  6.  * Create Time : 2012-3-21 23:48:14 
  7.  * Mail        : jbiaojerry@gmail.com 
  8.  * Blog        : http://blog.csdn.net/jerryjbiao  
  9.  *                
  10.  * Description :  简单的程序诠释C++ STL算法系列之十四                   
  11.  *                变易算法 : 反向复制copy_backward  
  12.  *                
  13.  ******************************************************************/  
  14.   
  15. #include <iostream>  
  16. #include <algorithm>  
  17. #include <vector>  
  18. #include <iterator>  
  19. #include <string>  
  20.   
  21. using namespace std;  
  22.   
  23. class output_element  
  24. {  
  25. public:  
  26.     //重载运算符()  
  27.     void operator() (string element)  
  28.     {  
  29.         cout << element  
  30.              << ( _line_cnt++ % 7 ? " " : "\n\t"); //格式化输出,即每7个换行和制表位  
  31.     }  
  32.   
  33.     static void reset_line_cnt()   
  34.     {  
  35.         _line_cnt = 1;  
  36.     }  
  37.   
  38. private:  
  39.     static int _line_cnt;  
  40.   
  41. };  
  42.   
  43. int output_element::_line_cnt = 1; //定义并初始静态数据成员  
  44.   
  45. int main()  
  46. {  
  47.     string sa[] = {  
  48.         "The""light""untonusred""hair",  
  49.         "grained""and""hued""like""pale""oak"  
  50.     };  
  51.   
  52.     vector<string> svec(sa, sa+10);  
  53.       
  54.     //还记得for_each吧,呵呵,这里用它来作为输出  
  55.     //for_each具体用法参考 http://blog.csdn.net/jerryjbiao/article/details/6827508  
  56.     cout << "Original list of strings:\n\t";  
  57.     for_each( svec.begin(), svec.end(), output_element() );  
  58.     cout << "\n" << endl;  
  59.   
  60.     //将"The", "light", "untonusred", "hair","grained",   
  61.     //"and", "hued"后移三个单元覆盖了"like", "pale", "oak"  
  62.     copy_backward(svec.begin(), svec.end()-3, svec.end());  
  63.   
  64.     output_element::reset_line_cnt();  
  65.   
  66.     cout << "sequence after "  
  67.          << "copy_backward(svec.begin(), svec.end()-3, svec.end()): \n\t";  
  68.     for_each( svec.begin(), svec.end(), output_element() );  
  69.     cout << "\n" << endl;  
  70.   
  71.     return 0;  
  72. }  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值