vector的底層是用動態陣列來儲存的,當我們用vectorvect
這樣的形式宣告的時候,陣列的長度是0,當我們插入第乙個元素的時候,陣列的長度會變為1,當插入第二個的時候,陣列長度會變為2,當插入第三個元素的時候,陣列長度變為4,當插入第三,第四個元素的時候,陣列長度不變,當插入第五個的時候,陣列長度變為8,由此我們可以看到,陣列長度的分配策略:
當陣列長度不夠容納新的元素時,陣列長度變為原來的兩倍。
(可以用vect.capacity()
)
#include
#include
#include
using
namespace
std;
int num = 0;
class node
cout
《為了簡單,我只push了5個元素,我們看著執行結果簡單分析一下:
0x70fe30 建構函式 0
0x151540 拷貝建構函式 0
0x70fe30 析構函式 0
0x70fe30 建構函式 1
0x151a14 拷貝建構函式 1
0x151a10 拷貝建構函式 0
0x151540 析構函式 0
0x70fe30 析構函式 1
0x70fe30 建構函式 2
0x151548 拷貝建構函式 2
0x151540 拷貝建構函式 0
0x151544 拷貝建構函式 1
0x151a10 析構函式 0
0x151a14 析構函式 1
0x70fe30 析構函式 2
0x70fe30 建構函式 3
0x15154c 拷貝建構函式 3
0x70fe30 析構函式 3
0x70fe30 建構函式 4
0x151a20 拷貝建構函式 4
0x151a10 拷貝建構函式 0
0x151a14 拷貝建構函式 1
0x151a18 拷貝建構函式 2
0x151a1c 拷貝建構函式 3
0x151540 析構函式 0
0x151544 析構函式 1
0x151548 析構函式 2
0x15154c 析構函式 3
0x70fe30 析構函式 4
120x151a10 析構函式 0
0x151a14 析構函式 1
0x151a18 析構函式 2
0x151a1c 析構函式 3
0x151a20 析構函式 4
第一次插入的時候,容量為0:
首先構造物件,值為0,陣列容量變為1,然後拷貝構造,拷貝構造的是動態陣列中的元素。
第二次插入的時候,容量為1:
首先構造物件,值為1,發現陣列長度不夠,陣列擴大為原來的2倍,然後拷貝構造1和原來的0。
第三次插入的時候,容量為2:
首先構造物件,值為2,發現陣列長度不夠,陣列擴大為原來的2倍,然後拷貝構造2和原來的0,1。
第四次插入的時候,容量為4:
首先構造物件,值為3,發現陣列可以容納新元素,直接拷貝構造3到陣列
第五次插入的時候,容量為4:
首先構造物件,值為4,發現陣列長度不夠,所有擴大為原來的2倍,然後拷貝構造4和原來的0,1,2,3。
通過上面的分析,不難發現,每當發生建構函式的時候,必有一次拷貝構造伴隨,然後放入陣列中,多餘的拷貝過程發生在陣列長度不夠的時候,每次擴大陣列,都要把之前的元素拷貝一次,而擴大陣列的時候,也正是陣列插入第2n
+12 n+
1元素的時候,這個時候,我們需要把前面的2n
2
n個元素拷貝一次。
所以當push n個元素到vector中:
C STL之vector的拷貝構造
拿到這道題可能很多人都已經暗自裡慶幸,對於學習過過資料結構的人,對於vector這個結構體一定不會陌生,但是如果在面試的過程中面試官考到了這道題我們要該如何來系統的答出令面試官滿意的答案。下面我們按照一定的條理從下面幾個步驟來回答這個問題 1 第一點應該清楚vector使用的是深拷貝 2 選擇合適的...
C 中的拷貝建構函式
在c 中,下面三種物件需要呼叫拷貝建構函式 1 乙個物件以值傳遞的方式傳入函式體 2 乙個物件以值傳遞的方式從函式返回 3 乙個物件需要通過另外乙個物件進行初始化 注意 1.如果不主動編寫拷貝建構函式和賦值函式,編譯器將以 位拷貝 的方式自動生成預設的函式。2.類中有指標型別的資料成員事就要呼叫自己...
C 中的拷貝建構函式
今天在學習c 時看到了這樣一句話 就好奇為什麼我們需要自己定義拷貝建構函式,以及 當我們自己定義拷貝建構函式後,成員變數的逐個拷貝 功能失效如何理解?1 如果類只包含類型別成員和內建型別的成員,則可以不用顯示定義複製建構函式。但如果類中包含有指標或者有分配其他型別資源時就必須重新定義複製建構函式。因...