stl 之 copy copy_backward

http://blog.csdn.net/jerryjbiao/article/details/7381498


元素复制算法copy

该算法主要用于容器之间元素的拷贝,即将迭代器区间[first,last)的元素复制到由复制目标result给定的区间[result,result+(last-first))中。下面我们来看看它的函数原型:

函数原形:

[cpp]  view plain copy
  1. template<class InputIterator, class OutputIterator>  
  2.    OutputIterator copy(  
  3.       InputIterator _First,   
  4.       InputIterator _Last,   
  5.       OutputIterator _DestBeg  
  6.    );  

参数

_First, _Last
指出被复制的元素的区间范围[ _First,_Last).
_DestBeg 
指出复制到的目标区间起始位置

返回值

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

程序示例:

首先我们来一个简单的示例,定义一个简单的整形数组myints,将其所有元素复制到容器myvector中,并将数组向左移动一位。

[cpp]  view plain copy
  1. /******************************************************************* 
  2.  * Copyright (C) Jerry Jiang 
  3.  *                
  4.  * File Name   : copy01.cpp 
  5.  * Author      : Jerry Jiang 
  6.  * Create Time : 2012-3-20 22:44:28 
  7.  * Mail        : jbiaojerry@gmail.com 
  8.  * Blog        : http://blog.csdn.net/jerryjbiao  
  9.  *                
  10.  * Description :  简单的程序诠释C++ STL算法系列之十三                  
  11.  *                变易算法 : 元素复制copy   
  12.  *                
  13.  ******************************************************************/  
  14.   
  15. #include <iostream>  
  16. #include <algorithm>  
  17. #include <vector>  
  18.   
  19. using namespace std;  
  20.   
  21. int main ()   
  22. {  
  23.     int myints[] = {10, 20, 30, 40, 50, 60, 70};  
  24.     vector<int> myvector;  
  25.     vector<int>::iterator it;  
  26.       
  27.     myvector.resize(7);   // 为容器myvector分配空间  
  28.       
  29.     //copy用法一:  
  30.     //将数组myints中的七个元素复制到myvector容器中  
  31.     copy ( myints, myints+7, myvector.begin() );  
  32.       
  33.     cout << "myvector contains: ";  
  34.     for ( it = myvector.begin();  it != myvector.end();  ++it )  
  35.     {  
  36.         cout << " " << *it;  
  37.     }  
  38.     cout << endl;  
  39.   
  40.     //copy用法二:  
  41.     //将数组myints中的元素向左移动一位  
  42.     copy(myints + 1, myints + 7, myints);  
  43.   
  44.     cout << "myints contains: ";  
  45.     for ( size_t i = 0; i < 7; ++i )  
  46.     {  
  47.         cout << " " << myints[i];  
  48.     }  
  49.     cout << endl;  
  50.   
  51.     return 0;  
  52. }  


从上例中我们看出copy算法可以很简单地将一个容器里面的元素复制至另一个目标容器中,上例中代码特别要注意一点就是myvector.resize(7);这行代码,在这里一定要先为vector分配空间,否则程序会崩,这是初学者经常犯的一个错误。其实copy函数最大的威力是结合标准输入输出迭代器的时候,我们通过下面这个示例就可以看出它的威力了。

[cpp]  view plain copy
  1. /******************************************************************* 
  2.  * Copyright (C) Jerry Jiang 
  3.  *                
  4.  * File Name   : copy2.cpp 
  5.  * Author      : Jerry Jiang 
  6.  * Create Time : 2012-3-20 23:25:29 
  7.  * Mail        : jbiaojerry@gmail.com 
  8.  * Blog        : http://blog.csdn.net/jerryjbiao  
  9.  *                
  10.  * Description :  简单的程序诠释C++ STL算法系列之十三                  
  11.  *                变易算法 : 元素复制copy   
  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. int main ()   
  24. {  
  25.      typedef vector<int> IntVector;  
  26.      typedef istream_iterator<int> IstreamItr;  
  27.      typedef ostream_iterator<int> OstreamItr;  
  28.      typedef back_insert_iterator< IntVector > BackInsItr;  
  29.    
  30.      IntVector myvector;  
  31.   
  32.      // 从标准输入设备读入整数  
  33.      // 直到输入的是非整型数据为止 请输入整数序列,按任意非数字键并回车结束输入  
  34.      cout << "Please input element:" << endl;  
  35.      copy(IstreamItr(cin), IstreamItr(), BackInsItr(myvector));  
  36.   
  37.      //输出容器里的所有元素,元素之间用空格隔开  
  38.      cout << "Output : " << endl;  
  39.      copy(myvector.begin(), myvector.end(), OstreamItr(cout, " "));   
  40.      cout << endl;  
  41.   
  42.     return 0;  
  43. }  

copy_backward(first, last, result)

拷贝行为和copy类似,只是方向相反

对于区间[first, last) 内每一个元素,以逆方向复制到以result - 1 为起点,方向亦为逆行的区间。大体模拟就是

*(result - 1)= *(last - 1), *(result - 2)= *(last - 2), *(result - 3)= *(last - 3),..

返回的迭代器为result - (last-first)


当源区间和目标区间不重叠时,或者是两个不同的 缓冲区,copy 和copy_backward最终的效果是类似的。

但是,如果区间有重叠,问题就出现了:


copy允许尾部和输入区间重叠,

copy_backward允许头部和输入区间重叠


当不满足上述条件的重叠时,这两个函数不保证正确。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值