c++ 11中emplace_back替代push_back的相关知识点,含右值引用,move用法等

C++11引入了右值引用,转移构造函数,push_back()右值时就会调用构造函数和转移构造函数(原来是调用拷贝构造,会为临时变量申请堆空间,影响程序效率,C++11以后为右值引用调用转移构造函数,不会为临时变量申请堆空间,而是直接赋值,提高程序效率)。

使用mplace_back替代push_back()可以在这上面有进一步优化空间,只调用构造函数不需要调用右值引用转移构造函数。
如:
reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936)); //有类的创建
elections.emplace_back("Nelson Mandela", "South Africa", 1994); //没有类的创建

一、主要知识点
C++ 11 左值,右值,左值引用,右值引用,std::move, std::foward

emplace_back() 和 push_back 的区别



二、其他相关知识点:

C++11中std::move的使用

	vector<string> v;
	string a = "123";	//或std::string &&a = "123";显示的标识a是全局字符串"123"的右值引用
	cout<< "at first, std::string a is: " << a<<endl;	//打印123

	/*右值"123", 它的所有者将从原先的左值(变量std::string a), 转移到新的左值(std::vector v)
	*所以, 使用std::move时一定保证, 以前的左值不再真需要了. 典型使用场合就是: (构造)函数的参数, 避免了再复制*/
	v.push_back(std::move(a));
	cout << "after std::move(a), now std::string a is: " << a;	//打印空
最后的glog将无法打印出a最开始的拷贝构造获取的值"123",因为全局字符串"123"的所有者,已经从最开始的变量a,转移到了v

C++ 11中的左值引用和右值引用



©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页