C++ 淺談emplace_back及使用誤區(qū)
今天做c++ primer題目實(shí)現(xiàn)標(biāo)準(zhǔn)庫(kù)vector,emplace_back忽然發(fā)現(xiàn)我對(duì)其了解甚少,首先,我在網(wǎng)上找到答案的代碼,之前有過(guò)了解emplace_back是通過(guò)移動(dòng)構(gòu)造函數(shù)實(shí)現(xiàn)的,那么問(wèn)題來(lái)了,如果我想實(shí)現(xiàn)vector<Base> b這樣,我將其移動(dòng)構(gòu)造函數(shù)顯式刪除,那么
b.emplace_back(....),還能工作嗎? 答案是 : 能
//Base.h #include<string> class Base { public: Base() = default; Base(std::string t,int m):s(t),i(m){} Base(const Base& b):s(b.s),i(b.i){} Base(Base&&) = delete; private: std::string s; int i; };
這似乎符合我們的期望,可當(dāng)我嘗試使用自定義的版本(也就是網(wǎng)上那些"高手"的,還是外國(guó)人放在github的,呵呵啦,害我找這么久原因,不是坑嗎?) 自定義版本如下:
template<typename T> template<class ...Args> void Vec<T>::emplace_back(Args&& ...args) { chk_n_alloc(); alloc.construct(first_free++, std::forward<Args>(args)...); }
補(bǔ)充知識(shí):C++11新特性,推薦使用emplace_back()替換push_back()的原因
c++11新加入了emplace_back()用來(lái)替換push_back():
在平時(shí)我們習(xí)慣性的尾插用push_back()去完成,但是如果是尾插臨時(shí)對(duì)象的話,push_back()需要先構(gòu)造臨時(shí)對(duì)象,再將這個(gè)對(duì)象拷貝到容器的末尾,而emplace_back()則直接在容器的末尾構(gòu)造對(duì)象,這樣就省去了拷貝的過(guò)程。
分析如下代碼:
#include<bits/stdc++.h> using namespace std; int i=0,j=0; class A { public: A(int i){ str = to_string(i); cout << "構(gòu)造函數(shù)" <<++i<< endl; } ~A(){} A(const A& a): str(a.str){ cout << "拷貝構(gòu)造" <<++j<< endl; } public: string str; }; int main(){ vector<A> vec; vec.reserve(10);//開(kāi)辟capacity for(int i=0;i<10;i++){ vec.push_back(i); //調(diào)用了10次構(gòu)造函數(shù)和10次拷貝構(gòu)造函數(shù), // vec.emplace_back(i); //調(diào)用了10次構(gòu)造函數(shù)一次拷貝構(gòu)造函數(shù)都沒(méi)有調(diào)用過(guò) } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方歡迎留言討論,望不吝賜教。
相關(guān)文章
C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法詳解
這篇文章主要為大家詳細(xì)介紹了C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下2023-03-03C語(yǔ)言中g(shù)etchar函數(shù)詳解看這一篇就夠了(函數(shù)功能、使用、返回值)
getchar讀取字符的函數(shù),今天通過(guò)本文給大家介紹C語(yǔ)言中g(shù)etchar函數(shù)簡(jiǎn)介用法示例詳解,感興趣的朋友跟隨小編一起看看吧2023-02-02C++開(kāi)源庫(kù)nlohmann/json的介紹和使用詳解
nlohmann/json?是一個(gè)C++實(shí)現(xiàn)的JSON解析器,使用非常方便直觀,這篇文章主要為大家詳細(xì)介紹了nlohmann/json的簡(jiǎn)介和使用,需要的可以參考下2023-12-12c語(yǔ)言的cps實(shí)現(xiàn)求fibonacci數(shù)列示例
這篇文章主要介紹了c語(yǔ)言的cps實(shí)現(xiàn)求fibonacci數(shù)列示例,需要的朋友可以參考下2014-03-03NDK 數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與棧等的實(shí)現(xiàn)
這篇文章主要介紹了NDK 數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與棧等的實(shí)現(xiàn)的相關(guān)資料,希望通過(guò)本文大家能理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10