成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文弄清楚 push_back 和 emplace_back 的區別

開發 前端
emplace_back 的缺點是代碼可讀性相對差些,因此,對于往容器尾部添加元素的操作,選擇 push_back將會使你的代碼可讀性更好,能更好的表達出代碼編寫者的目的,代碼更健壯。

在 vector 中有一個 push_back 方法,作用是往容器尾部插入一個元素,后來在 c++11 里面,又加入了一個 emplace_back 方法, 作用和push_back 一樣

既然兩者功能一樣,那它們之間有什么區別呢 ?使用的時候如何選擇呢 ?

效率

emplace_back 在效率上比 push_back 要好一些,請看下面的例子:

#include<iostream>
#include <vector>
using namespace std;

class MyTest
{
public:
//普通構造
MyTest(int id,int age):m_id(id),m_age(age)
{
cout << "ceate MyTest class..." << this << endl;
}
//拷貝構造
MyTest(const MyTest &t):m_id(t.m_id),m_age(t.m_age)
{
cout << "copy construct called..." << this << endl;
}
//移動構造
MyTest(const MyTest &&t)
{
m_id = std::move(t.m_id);
m_age = std::move(t.m_age);
cout << "move contruct called.." << this << endl;
}
//析構
~MyTest()
{
cout << "destory MyTest class..." << this << endl;
}
private:
int m_id; //id成員
int m_age;//age成員
};

int main(int argc, char *argv[])
{
vector<MyTest> vec;
vec.reserve(2); //預先分配內存
cout << "\n ------ push_back --------" << endl;
vec.push_back(MyTest(1,20));
cout << "\n ------ emplace_back --------" << endl;
vec.emplace_back(1,20);
cout << "\n -------- finish -------- " << endl;
}

使用 g++ -g -Wall -std=c++11 -o t t.cpp 命令編譯,運行程序,結果如下:

 ------ push_back --------
ceate MyTest class...
move contruct called..
destory MyTest class...

------ emplace_back --------
ceate MyTest class...

-------- finish --------
destory MyTest class...
destory MyTest class...

從結果可以看出,同樣是在容器尾部加入一個元素,push_back 和 emplace_back 的過程是不一樣的;

  • push_back 的過程

構造一個臨時對象

調用移動構造函數把臨時對象的副本拷貝到容器末尾增加的元素中

調用析構釋放臨時對象

  • emplace_back 的過程

調用構造函數在容器末尾增加一個元素

同樣是在容器尾部增加一個元素,emplace_back 比 push_back 少了一次對象的構造和析構, 所以,emplace_back 比 push_back 更高效, 具體能高效多少呢,這里進行了一個插入 一百萬 個對象的測試,emplace_back 比 push_back 快大概 20% ,下面是測試代碼 :

//獲取當前時間,單位: 毫秒
int64_t cur_msec()
{
struct timespec tp1;
clock_gettime(CLOCK_REALTIME, &tp1);
return (tp1.tv_sec * 1000 + (int64_t)tp1.tv_nsec / 1000000.0);
}
//測試函數
void test()
{
vector<MyTest> vec1;
vector<MyTest> vec2;
vec1.reserve(1000000);
vec2.reserve(1000000);

int64_t t1 = cur_msec();
for (size_t i = 0; i < 1000000; i++)
{
vec1.push_back(MyTest(1,20));
}
int64_t t2 = cur_msec();
for (size_t i = 0; i < 1000000; i++)
{
vec2.emplace_back(1,20);
}
int64_t t3 = cur_msec();

cout << " push_back cost " << (t2 - t1) << " millisecond " << endl;
cout << " emplace_back cost " << (t3 - t2) << " millisecond " << endl;
}

emplace_back 的缺點

既然 emplace_back 比 push_back 更高效,是不是每次都用 emplace_back 就完了呢?

我們日常寫代碼,除了執行率之外,還要考慮可讀性,理解成本等,雖然emplace_back 效率高些,但是它也是有缺點的,比如:

vec1.push_back(1000000);
vec2.emplace_back(1000000);

第一行程序代碼很好理解,往 容器vec1尾部加入一個整數 1000000,然而,第二行程序代碼就不是很直觀了,由于我們不知道 vec2 的實際類型,所以無法獲得這行代碼執行的結果

假如,vec2 的類型是 vector,那么它的含義和第一行一樣,往容器vec2尾部添加整數 1000000

假如,vec2 的類型是 vector< vector >,那么它就構造了一個包含 1000000 個元素的容器,按照每個元素 4 個字節來計算,執行第二行代碼需要分配差不多近 4M 的內存空間

如何選擇

emplace_back 的缺點是代碼可讀性相對差些,因此,對于往容器尾部添加元素的操作,選擇 push_back將會使你的代碼可讀性更好,能更好的表達出代碼編寫者的目的,代碼更健壯

像上節中的例子,一個 vector< vector > 類型的容器 vec,vec.emplace_back(1000000) 能編譯通過,在運行到這行代碼之前可能還無法發現錯誤,但是如果調用 vec.push_back(1000000) 在編譯的時候就會報錯,能更早的發現問題

當然,既然 emplace_back 比 push_back 更快,我們也不能因為容易出錯就不使用它,在對效率有要求的場景中,推薦使用 emplace_back,當對效率要求沒那么高,或者使用 emplace_back 和 push_back 效率差別不大時,從項目代碼可讀性,可維護性的角度考慮的話,優先使用 push_back。

責任編輯:武曉燕 來源: Linux開發那些事兒
相關推薦

2025-05-08 08:05:00

C++代碼編程

2022-04-07 08:37:05

鏈表技巧單鏈表

2025-02-07 09:58:43

C++11Lvalue對象

2012-05-28 10:06:05

項目開發項目管理開發

2018-10-25 09:26:07

VLANVXLAN網絡

2022-05-30 08:05:11

架構

2017-03-31 15:30:09

2023-01-09 08:38:22

大數據架構師YARN

2024-01-12 08:26:16

Linux磁盤文件系統

2017-09-26 10:36:52

云端部署內部

2023-02-26 21:33:49

混合云架構模式

2025-05-06 09:30:00

DevOps云原生開發

2025-03-03 08:40:00

JavaScriptthis開發

2021-05-09 22:26:36

Python函數變量

2020-02-18 16:48:48

大腦CPU包裝

2017-10-28 23:00:52

多云混合云云計算

2021-03-11 15:49:44

人工智能深度學習

2021-10-29 11:30:31

補碼二進制反碼

2024-04-10 13:50:41

CentOSUbuntu操作系統

2017-07-28 09:11:14

HIVEHBASE區別
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区在线视频 | 国产一区二区在线免费视频 | 国产精品99久久久久久久久久久久 | 免费日韩av | 日本欧美国产在线观看 | 日韩影音| 国产精品久久久久久久免费观看 | 欧美激情久久久 | 久久久久成人精品免费播放动漫 | 综合久久网 | 亚洲国产精品久久久久婷婷老年 | 亚洲精品一区二区在线观看 | 日日艹夜夜艹 | 国产精品久久久久久久久久久久冷 | 国产亚洲精品久久午夜玫瑰园 | 欧美色人 | 久久久高清 | 久久综合久 | 日本不卡一区二区三区在线观看 | 99在线国产| 刘亦菲国产毛片bd | 久久久国产精品视频 | 日日噜噜噜夜夜爽爽狠狠视频, | 亚洲精品视频免费观看 | 亚洲综合色 | 亚洲欧美在线视频 | 中文字幕久久久 | 九九99九九精彩46 | 蜜桃视频麻豆 | 在线视频久久 | 国产精品一区二区三区四区五区 | 国产精品久久久久一区二区三区 | 成人美女免费网站视频 | 国产视频日韩 | 国产免费观看一级国产 | 久久精品伊人 | 中文久久 | 风间由美一区二区三区在线观看 | 精品国产91 | 日韩一区二区在线视频 | 欧美成人精品一区二区男人看 |