• STL algorithm算法mov,move_backward(38)


    move原型:

    std::move

    template <class InputIterator, class OutputIterator>
      OutputIterator move (InputIterator first, InputIterator last, OutputIterator result);
    该函数是将指定范围内的元素移动到从result開始的位置。

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

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

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

    其行为类似于:

    
    3
    4
    5
    6
    7
    8
    9
    
    template<class InputIterator, class OutputIterator>
      OutputIterator move (InputIterator first, InputIterator last, OutputIterator result)
    {
      while (first!=last) {
        *result = std::move(*first);
        ++result; ++first;
      }
      return result;
    }
    一个简单的样例:

    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    void mmove(){
        vector<int> vi{3,5,1,1};
        vector<int> v2{3,5,5,1};
        vector<int> result{1,2,3,4,5,6,7};
        cout<<"vi=";
        for(int i:vi)
            cout<<i<<" ";
        cout<<endl;
        cout<<"result=";
        for(int i:result)
            cout<<i<<" ";
        cout<<endl;
        auto it=move(vi.begin(),vi.end(),result.begin());
        cout<<"after  auto it=move(vi.begin(),vi.end(),result.begin())"<<endl;
        cout<<"vi=";
        for(int i:vi)
            cout<<i<<" ";
        cout<<endl;
        cout<<"result=";
        for(int i:result)
            cout<<i<<" ";
        cout<<endl;
        cout<<"it="<<*it<<endl;
    
        cout<<"v2=";
        for(int i:v2)
            cout<<i<<" ";
        cout<<endl;
        auto it2=move(v2.begin()+1,v2.end(),v2.begin());
        cout<<"after     auto it2=move(v2.begin()+1,v2.end(),v2.begin());"<<endl;
        cout<<"v2=";
        for(int i:v2)
            cout<<i<<" ";
        cout<<endl;
        if(it2==v2.end())
            cout<<"it2==v2.end()"<<endl;
        else
            cout<<"it2="<<*it2<<endl;
    
    
    
    }
    
    执行截图:


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

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




    move_backward原型:

    std::move_backward

    template <class BidirectionalIterator1, class BidirectionalIterator2>
      BidirectionalIterator2 move_backward (BidirectionalIterator1 first,
                                            BidirectionalIterator1 last,
                                            BidirectionalIterator2 result);
    该函数是将范围[first,last)内的元素从后往前移动到result的位置。result覆盖的顺序也是逆序的。

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

    其行为类似于:

    template<class BidirectionalIterator1, class BidirectionalIterator2>
      BidirectionalIterator2 move_backward ( BidirectionalIterator1 first,
                                             BidirectionalIterator1 last,
                                             BidirectionalIterator2 result )
    {
      while (last!=first) *(--result) = std::move(*(--last));
      return result;
    }
    一个简单的样例:

    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    void mmovebackward(){
        vector<int> vi{99,5,1,1};
        vector<int> result{1,2,88,4,5,6,7};
        cout<<"vi=";
        for(int i:vi)
            cout<<i<<" ";
        cout<<endl;
        cout<<"result=";
        for(int i:result)
            cout<<i<<" ";
        cout<<endl;
        auto it=move_backward(vi.begin(),vi.end(),result.end());
        cout<<"after  auto it=move_backward(vi.begin(),vi.end(),result.end())"<<endl;
        cout<<"vi=";
        for(int i:vi)
            cout<<i<<" ";
        cout<<endl;
        cout<<"result=";
        for(int i:result)
            cout<<i<<" ";
        cout<<endl;
        cout<<"it="<<*it<<endl;
    
    
    
    }
    
    执行截图:


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


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

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

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

    author:天下无双

    Email:coderguang@gmail.com

    2014-9-19

    于GDUT

    ———


  • 相关阅读:
    IO流
    myEclipse的使用
    单例模式
    日期的使用
    String类的常用方法
    break、continue和return的区别
    包装类和随机数
    enum类的使用
    Java基础概念性的知识总结
    汇编中的函数调用与递归
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5129818.html
Copyright © 2020-2023  润新知