move原型:

std::move

  1. template <class InputIterator, class OutputIterator>
  2. OutputIterator move (InputIterator first, InputIterator last, OutputIterator result);

该函数是将指定范围内的元素移动到从result開始的位置。

move之后。[first,last)范围内的元素去留的详细实现由编译器决定。

result不能是在[first,last)范围内。

返回值为result中最后一个被覆盖元素的下一个位置元素的迭代器

其行为类似于:


  1. 3
  2. 4
  3. 5
  4. 6
  5. 7
  6. 8
  7. 9
  1. template<class InputIterator, class OutputIterator>
  2. OutputIterator move (InputIterator first, InputIterator last, OutputIterator result)
  3. {
  4. while (first!=last) {
  5. *result = std::move(*first);
  6. ++result; ++first;
  7. }
  8. return result;
  9. }

一个简单的样例:

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. void mmove(){
  6. vector<int> vi{3,5,1,1};
  7. vector<int> v2{3,5,5,1};
  8. vector<int> result{1,2,3,4,5,6,7};
  9. cout<<"vi=";
  10. for(int i:vi)
  11. cout<<i<<" ";
  12. cout<<endl;
  13. cout<<"result=";
  14. for(int i:result)
  15. cout<<i<<" ";
  16. cout<<endl;
  17. auto it=move(vi.begin(),vi.end(),result.begin());
  18. cout<<"after auto it=move(vi.begin(),vi.end(),result.begin())"<<endl;
  19. cout<<"vi=";
  20. for(int i:vi)
  21. cout<<i<<" ";
  22. cout<<endl;
  23. cout<<"result=";
  24. for(int i:result)
  25. cout<<i<<" ";
  26. cout<<endl;
  27. cout<<"it="<<*it<<endl;
  28.  
  29. cout<<"v2=";
  30. for(int i:v2)
  31. cout<<i<<" ";
  32. cout<<endl;
  33. auto it2=move(v2.begin()+1,v2.end(),v2.begin());
  34. cout<<"after auto it2=move(v2.begin()+1,v2.end(),v2.begin());"<<endl;
  35. cout<<"v2=";
  36. for(int i:v2)
  37. cout<<i<<" ";
  38. cout<<endl;
  39. if(it2==v2.end())
  40. cout<<"it2==v2.end()"<<endl;
  41. else
  42. cout<<"it2="<<*it2<<endl;
  43.  
  44. }

执行截图:



能够看到。假设result在[first,last)范围内,将改写原来的元素。

特别是有可能你move的元素是你已经改动了的元素,导致了你不希望的行为。

move_backward原型:

std::move_backward

  1. template <class BidirectionalIterator1, class BidirectionalIterator2>
  2. BidirectionalIterator2 move_backward (BidirectionalIterator1 first,
  3. BidirectionalIterator1 last,
  4. BidirectionalIterator2 result);

该函数是将范围[first,last)内的元素从后往前移动到result的位置。result覆盖的顺序也是逆序的。

该函数返回目的范围result的从顺序来看第一个被覆盖的元素(是指顺着看第一个被覆盖的元素而不是首先被覆盖的元素)(看以下详细的样例)。

其行为类似于:

  1. template<class BidirectionalIterator1, class BidirectionalIterator2>
  2. BidirectionalIterator2 move_backward ( BidirectionalIterator1 first,
  3. BidirectionalIterator1 last,
  4. BidirectionalIterator2 result )
  5. {
  6. while (last!=first) *(--result) = std::move(*(--last));
  7. return result;
  8. }

一个简单的样例:

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. void mmovebackward(){
  6. vector<int> vi{99,5,1,1};
  7. vector<int> result{1,2,88,4,5,6,7};
  8. cout<<"vi=";
  9. for(int i:vi)
  10. cout<<i<<" ";
  11. cout<<endl;
  12. cout<<"result=";
  13. for(int i:result)
  14. cout<<i<<" ";
  15. cout<<endl;
  16. auto it=move_backward(vi.begin(),vi.end(),result.end());
  17. cout<<"after auto it=move_backward(vi.begin(),vi.end(),result.end())"<<endl;
  18. cout<<"vi=";
  19. for(int i:vi)
  20. cout<<i<<" ";
  21. cout<<endl;
  22. cout<<"result=";
  23. for(int i:result)
  24. cout<<i<<" ";
  25. cout<<endl;
  26. cout<<"it="<<*it<<endl;
  27.  
  28. }

执行截图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

注意的是。返回的是指向result中的99元素的迭代器,而不是first,last范围内的first!

——————————————————————————————————————————————————————————————————

//写的错误或者不好的地方请多多指导,能够在以下留言或者点击左上方邮件地址给我发邮件,指出我的错误以及不足,以便我改动,更好的分享给大家。谢谢。

转载请注明出处:http://blog.csdn.net/qq844352155

author:天下无双

Email:coderguang@gmail.com

2014-9-19

于GDUT

———

STL algorithm算法mov,move_backward(38)的更多相关文章

  1. STL algorithm算法merge(34)

    merge原型: std::merge default (1) template <class InputIterator1, class InputIterator2, class Outpu ...

  2. STL algorithm算法mismatch(37)

    mismatch原型: std::mismatch equality (1) template <class InputIterator1, class InputIterator2> p ...

  3. STL algorithm算法is_permutation(27)

    is_permutation原型: std::is_permutation equality (1) template <class ForwardIterator1, class Forwar ...

  4. STL algorithm算法lower_bound和upper_bound(31)

    lower_bound原型: function template <algorithm> std::lower_bound default (1) template <class F ...

  5. STL algorithm算法minmax,minmax_element(36)

    minmax原型: std::minmax C++11 C++14 default (1) template <class T> pair <const T&,const T ...

  6. STL algorithm算法min,min_element(35)

    min样板: std::min C++98 C++11 C++14 default (1) template <class T> const T& min (const T& ...

  7. STL algorithm算法max,max_elements(33)

    max原型: std::max C++98 C++11 C++14 default (1) template <class T> const T& max (const T& ...

  8. STL algorithm算法make_heap和sort_heap(32)

    make_heap原型: std::make_heap default (1) template <class RandomAccessIterator> void make_heap ( ...

  9. STL algorithm算法lexicographical_compare(30)

    lexicographical_compare原型: std::lexicographical_compare default (1) template <class InputIterator ...

随机推荐

  1. C#运算符小例子

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. android 图片特效处理之 光晕效果

    这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...

  3. html ---- a 标签 在新窗口打开的问题

  4. 69.类型后缀,重载操作符""

    #include <iostream> using namespace std; class myclass { public: int num; int num2; public: my ...

  5. class的写法

    java中class的写法:1.public class xxx{}2.非public类:public class A{}public class B{}必须保证一个其中一个类名是public并与ja ...

  6. linux的dhcp4.1.1服务部署

     Centos6.5的dhcp4.1.1服务部署 实施步骤: 1:设置DHCP服务器静态IP和主机名 [root@sw ~]# vim /etc/sysconfig/network-scripts/i ...

  7. VC多线程临界区

    在使用多线程时,一般非常少有多个线程全然独立的工作.往往是多个线程同一时候操作一个全局变量来获取程序的执行结果.多个线程同一时候訪问同一个全局变量,假设都是读取操作,则不会出现故障. 假设是写操作,则 ...

  8. (二十二)unity4.6学习Ugui中文文档-------交互-Eventsystem &amp; Binding

    大家好,我是孙广东.   转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unityma ...

  9. javaEE之------Spring-----》 AspectJ注解

    前面介绍了下Spring中的切面技术.如今说下採用注解的方式进行切面 首先肯定和之前的一样.须要一个自己主动代理的注解类 AnnotationAwareAspectJAutoProxyCreator ...

  10. Python-根据成绩分析是否继续深造

    案例:该数据集的是一个关于每个学生成绩的数据集,接下来我们对该数据集进行分析,判断学生是否适合继续深造 数据集特征展示 GRE 成绩 (290 to 340) TOEFL 成绩(92 to 120) ...