std::move
面试的时候被问到了c++11新特性,感觉答的不好,所以回来重新总结下:
1 产生背景:
首先 std::move是一个标准库函数。
虽然不能将一个右值引用直接绑定到一个左值上,但是可以显式的将一个左值转换为对应的右值引用类型。我们可以调用move来获得绑定到左值上的右值引用,头文件为。
int && rr3=std::move(rr1);
move告诉编译器:我们有一个左值,但我们希望像一个右值一样处理它。但是这也意味着:除了对rr1赋值或者销毁它,我们将不再使用它(移动源对象的值)。
#include // move (ranges)
#include // move (objects)
对容器的move 以及对容器每个对象的move
#include <iostream>
#include <vector>
#include <stddef.h>
#include <string>
#include <memory>
using namespace std;
int main()
{
vector<int> ves1{1,2,3};
vector<int> ves2(3);
vector<int> ves3(4);
cout<<"ves1 contains " << ves1.size() << " elements:";
for(int i:ves1) cout<<"["<<i<<"] ";
cout<<endl;
ves2=move(ves1);
cout<<"move all from ves1 to ves2"<<endl;
cout<<"ves1 contains " << ves1.size() << " elements:";
for(int i:ves1) cout<<"["<<i<<"] ";
cout<<endl;
cout<<"ves2 contains " << ves2.size() << " elements:";
for(int i:ves2) cout<<"["<<i<<"] ";
cout<<endl;
move(ves2.begin(),ves2.end(),ves3.begin());
cout<<"move one by one from ves2 to ves3:"<<endl;
cout<<"ves3 contains " << ves3.size() << " elements:";
for(int i:ves3) cout<<"["<<i<<"] ";
cout<<endl;
cout<<"ves2 contains " << ves2.size() << " elements:";
for(int i:ves2) cout<<"["<<i<<"] ";
cout<<endl;
return 0;
}

对字符串的操作
#include <iostream>
#include <vector>
#include <stddef.h>
#include <string>
#include <memory>
using namespace std;
int main()
{
string old="hello world";
cout<<"old ["<<old<<"]"<<endl;
string m=move(old);
cout<<"old ["<<old<<"]"<<endl;
cout<<"new ["<<m<<"]"<<endl;
return 0;
}

本文介绍了C++11中std::move的产生背景和使用,包括如何利用std::move进行容器的移动操作以及字符串的处理,强调了通过std::move将左值转换为右值引用以提高效率。

1094

被折叠的 条评论
为什么被折叠?



