move原型:
std::move
template <class InputIterator, class OutputIterator> OutputIterator move (InputIterator first, InputIterator last, OutputIterator result);
该函数是将指定范围内的元素移动到从result开始的位置。
move之后,[first,last)范围内的元素去留的具体实现由编译器决定。
result不能是在[first,last)范围内。
返回值为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:[email protected]
2014-9-19
于GDUT
———
时间: 2024-10-02 16:22:33