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++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++中的多態(tài)問(wèn)題—理解虛函數(shù)表及多態(tài)實(shí)現(xiàn)原理
這篇文章主要介紹了C++中的多態(tài)問(wèn)題—理解虛函數(shù)表及多態(tài)實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法之實(shí)現(xiàn)快速傅立葉變換
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法之實(shí)現(xiàn)快速傅立葉變換的相關(guān)資料,需要的朋友可以參考下2017-06-06
C語(yǔ)言Turbo C下實(shí)現(xiàn)俄羅斯方塊
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言Turbo C下寫(xiě)的俄羅斯方塊,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
C++ vector類(lèi)的模擬實(shí)現(xiàn)方法
這篇文章主要介紹了C++ vector類(lèi)的模擬實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05

