vector中存放物件和指標的區別

2021-09-19 08:06:34 字數 1014 閱讀 3320

這裡先說出結論:

vector中push_back物件時,會呼叫物件的拷貝建構函式。而且在vector空間不足時,繼續push_back,vector會將之前的所有物件都拷貝構造到一塊更大的空間裡。也就是說物件如果較大,那麼最好用vector儲存指標以減少呼叫拷貝構造 造成的消耗,如果vector存指標,那麼也就拷貝指標而已,消耗非常小。如果實在需要使用vector儲存物件,那麼盡量利用c++11提供的emplace_back代替push_back。

以下**是使用push_back新增物件到vector中的**:

#include #include using namespace std;

class test

~test()

//拷貝構造

test(const test&t1) };

int main()

執行結果如下:

可以看出,使用vector儲存物件效能會比較差,原因是其多次拷貝。儲存指標就不存在這些問題。

使用emplac_back代替push_back,和上面一樣的**如下

#include #include using namespace std;

class test

~test()

//拷貝構造

test(const test&t1) };

int main()

執行結果如下:

emplace_back就不再需要臨時物件了(預設呼叫無參構造),所以減少了臨時物件的構造與拷貝,但是vector擴容時的拷貝是無法避免的!

當然可以通過呼叫reserve來預估物件的數量可以防止或減少vector擴容帶來的效能損耗。

容器(容器中只能存放物件)

arraylist 本質是object陣列 private transient object elementdata 預設陣列的長度為10 add時超過10則陣列長度增加原來長度的一半 list變陣列 t list.toarray newt list.size linkedlist 本質是雙向的鍊錶...

C 對存放物件的Vector容器按自定義字段排序

此處定義結構體或者類都一樣,都可以借助演算法庫,自己定義排序規則,然後使用sort方法,靈活變通 student.h ifndef student h define student h endif class student student.cpp include include student.h...

Redis存放物件的兩種方式

使用者id為查詢的key 儲存的value使用者物件包括姓名,年齡,生日等等 如果用普通的key value結構來儲存,主要有以下2種方式儲存 這種方式是使用list或者set這些來儲存的,這樣的方式其實也可以達到我們想要的效果,但是因為每次修改屬性都需要三步走,效能開銷非常大。1.先反序列化 2,...