C STL容器擴容的效率問題

2021-10-24 18:24:02 字數 3633 閱讀 4521

這裡以stl中的vector容器舉個例子,vector初始化時的容量是比較小的(在不使用reserve的情況下),當需要擴容時,需要把之前所有的元素都通過拷貝建構函式的方式拷貝到新的記憶體空間中,這樣的效率是比較低的。

看下面這段**:

#include

#include

using

namespace std;

classaa

(const a &a)~a

()};

intmain()

return0;

}

執行輸出的結果為:

----------

加入第1個元素:

a construct function. val=1

加入第2個元素:

a construct function. val=2

a copy construct function. val=1

a destory function. val=1

加入第3個元素:

a construct function. val=3

a copy construct function. val=1

a copy construct function. val=2

a destory function. val=1

a destory function. val=2

加入第4個元素:

a construct function. val=4

加入第5個元素:

a construct function. val=5

a copy construct function. val=1

a copy construct function. val=2

a copy construct function. val=3

a copy construct function. val=4

a destory function. val=1

a destory function. val=2

a destory function. val=3

a destory function. val=4

加入第6個元素:

a construct function. val=6

加入第7個元素:

a construct function. val=7

加入第8個元素:

a construct function. val=8

加入第9個元素:

a construct function. val=9

a copy construct function. val=1

a copy construct function. val=2

a copy construct function. val=3

a copy construct function. val=4

a copy construct function. val=5

a copy construct function. val=6

a copy construct function. val=7

a copy construct function. val=8

a destory function. val=1

a destory function. val=2

a destory function. val=3

a destory function. val=4

a destory function. val=5

a destory function. val=6

a destory function. val=7

a destory function. val=8

加入第10個元素:

a construct function. val=10

a destory function. val=1

a destory function. val=2

a destory function. val=3

a destory function. val=4

a destory function. val=5

a destory function. val=6

a destory function. val=7

a destory function. val=8

a destory function. val=9

a destory function. val=10

從上述的輸出可以看出,vector的初始容量為1,下一次擴容變成2,再擴容成4,…,規律都是2的冪次。

vector的每一次擴容都會呼叫原有函式的拷貝建構函式和析構函式,造成效率低下。較好的方法是初始化容器的時候使用reserve預先開足夠大的空間。

例如:

#include

#include

using

namespace std;

classaa

(const a &a)~a

()};

intmain()

return0;

}

執行輸出的結果為:

----------

加入第1個元素:

a construct function. val=1

加入第2個元素:

a construct function. val=2

加入第3個元素:

a construct function. val=3

加入第4個元素:

a construct function. val=4

加入第5個元素:

a construct function. val=5

加入第6個元素:

a construct function. val=6

加入第7個元素:

a construct function. val=7

加入第8個元素:

a construct function. val=8

加入第9個元素:

a construct function. val=9

加入第10個元素:

a construct function. val=10

a destory function. val=1

a destory function. val=2

a destory function. val=3

a destory function. val=4

a destory function. val=5

a destory function. val=6

a destory function. val=7

a destory function. val=8

a destory function. val=9

a destory function. val=10

移動建構函式

當stl中儲存的元素中包含著無法被拷貝的資源時,例如申請的記憶體空間、io資源等等。這時如果我們使用拷貝建構函式去構造新物件,需要重新申請記憶體,這樣的效率會比較低,因此我們可以使用移動建構函式,接管原來物件的資源。

C STL容器的理解

1.容器 資料結構 演算法。相當於是為複雜的資料設計一種專門用於存放該資料的東西。用於開發中傳遞複雜的資料。2.模板函式只能寫在標頭檔案中,不能單獨宣告。3.stl容器分為三類 1 順序容器類 vector 陣列。查詢快,插入慢。加入的資料與資料大小有關 操作 empty 返回bool型,表示vec...

C STL中的容器

用c 寫資料結構習題也有一段時間了,不得不說stl容器對資料結構真的很有用。c stl standard template library,標準模板庫 是一套功能強大的 c 模板類,其中包含4個元件,分別為演算法 容器 函式 迭代器。所以想總結一下自己用的容器,為什麼要用它以及怎麼用?c c 原生的...

c STL中的容器

容器作為stl的重要組成部分,其主要包括兩大類 順序容器 和 關聯容器 雖說這二者都是用來儲存資料的資料結構,但是他們的底層實現和特長有很大差別 關聯容器有8種 1 map 紅黑樹 2 set 紅黑樹 3 multimap 紅黑樹 4 multiset 紅黑樹 5 unordered map 雜湊表...