亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ 淺談emplace_back及使用誤區(qū)

 更新時(shí)間:2020年12月10日 15:49:51   作者:RGBMarco  
這篇文章主要介紹了C++ 淺談emplace_back及使用誤區(qū),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

今天做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語(yǔ)言goto的應(yīng)用舉例以及詳解

    C語(yǔ)言goto的應(yīng)用舉例以及詳解

    goto的用法就是改變程序執(zhí)行的順序,從某個(gè)地方跳轉(zhuǎn)到你標(biāo)志的地方,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言goto的應(yīng)用舉例及詳解的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C語(yǔ)言的位段與枚舉詳解

    C語(yǔ)言的位段與枚舉詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的位段與枚舉,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C++實(shí)現(xiàn)聊天程序

    C++實(shí)現(xiàn)聊天程序

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)類似QQ聊天程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 一篇文章詳細(xì)解釋C++的友元(friend)

    一篇文章詳細(xì)解釋C++的友元(friend)

    這篇文章主要為大家詳細(xì)介紹了C++的友元(friend),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法詳解

    C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C\C++實(shí)現(xiàn)讀寫(xiě)二進(jìn)制文件的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • C++運(yùn)算符重載限制介紹

    C++運(yùn)算符重載限制介紹

    這篇文章主要介紹了C++運(yùn)算符重載限制,關(guān)于運(yùn)算符的重載并不是隨心所欲的。C++給出了一些限制,從而保證了規(guī)范,以及程序運(yùn)行的準(zhǔn)確性,下面來(lái)了解C++運(yùn)算符重載限制的詳細(xì)內(nèi)容吧,需要的朋友也可以參考一下
    2022-01-01
  • C語(yǔ)言中g(shù)etchar函數(shù)詳解看這一篇就夠了(函數(shù)功能、使用、返回值)

    C語(yǔ)言中g(shù)etchar函數(shù)詳解看這一篇就夠了(函數(shù)功能、使用、返回值)

    getchar讀取字符的函數(shù),今天通過(guò)本文給大家介紹C語(yǔ)言中g(shù)etchar函數(shù)簡(jiǎn)介用法示例詳解,感興趣的朋友跟隨小編一起看看吧
    2023-02-02
  • C++開(kāi)源庫(kù)nlohmann/json的介紹和使用詳解

    C++開(kāi)源庫(kù)nlohmann/json的介紹和使用詳解

    nlohmann/json?是一個(gè)C++實(shí)現(xiàn)的JSON解析器,使用非常方便直觀,這篇文章主要為大家詳細(xì)介紹了nlohmann/json的簡(jiǎn)介和使用,需要的可以參考下
    2023-12-12
  • c語(yǔ)言的cps實(shí)現(xiàn)求fibonacci數(shù)列示例

    c語(yǔ)言的cps實(shí)現(xiàn)求fibonacci數(shù)列示例

    這篇文章主要介紹了c語(yǔ)言的cps實(shí)現(xiàn)求fibonacci數(shù)列示例,需要的朋友可以參考下
    2014-03-03
  • NDK 數(shù)據(jù)結(jié)構(gòu)之隊(duì)列與棧等的實(shí)現(xiàn)

    NDK 數(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

最新評(píng)論