1. 程式人生 > >c++ 11中emplace_back替代push_back的相關知識點,含右值引用,move用法等

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::fowardemplace_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中的左值引用和右值引用