vector是一段連續的記憶體空間。start,finish,end_of_storage三個指標描述了空間狀態,這三個是普通的指標。start到finish是已經使用的記憶體,裡面有元素。finish到end_of_storage是未使用的記憶體,裡面沒有元素。
vectorres(m); //其空間capacity大小為m,但是沒有初始化其中的值,還沒有元素 size=0
vectorres(m, 0); //其空間(capacity)大小為m, 所有的值都為0,所有的資料型別都為int型別 size=m
還可以定義二維的vector
vector>res(m, vector(n, 0)); //相當於二位陣列,其大小為m*n,所有的值都為0
當然也可以不指定其大小,直接vectorres; 此時其size和capacity都為0。
問題:為什麼要成倍的擴容而不是一次增加乙個固定大小的容量呢?為什麼是以兩倍的方式擴容呢??
答:成倍擴充套件是為了保證常數時間的複雜度,以2倍方式擴容是為了防止記憶體的浪費,更好的實現對記憶體的利用。
分析:
比較一下兩種方式的效率
以成倍方式增長 :
假定有 n 個元素,倍增因子為 m;
完成這 n 個元素往乙個 vector 中的 push_back操作,需要重新分配記憶體的次數大約為 logm(n);
第 i 次重新分配將會導致複製 m^(i) (也就是當前的vector.size() 大小)個舊空間中元素;
n 次 push_back 操作所花費的時間復制度為o(n):
m / (m - 1),這是乙個常量,均攤分析的方法可知,vector 中 push_back 操作的時間複雜度為常量時間.
一次增加固定值大小
假定有 n 個元素,每次增加k個;
第i次增加複製的數量為為:100i
n 次 push_back 操作所花費的時間複雜度為o(n^2):
均攤下來每次push_back 操作的時間複雜度為o(n);
對比可以發現採用採用成倍方式擴容,可以保證常數的時間複雜度,而增加指定大小的容量只能達到o(n)的時間複雜度,因此,使用成倍的方式擴容。
成倍擴容的知乎回答:
vector擴容原理說明
include include using namespace std int main system pause return 0 總結 對比可以發現採用採用成倍方式擴容,可以保證常數的時間複雜度,而增加指定大小的容量只能達到o n 的時間複雜度,因此,使用成倍的方式擴容。第二個問題 vector...
ArrayList和Vector擴容機制
直接給原始碼,jdk1.8 private void grow int mincapacity 可以看到,增長是1.5倍。首先來看個建構函式 下圖的建構函式我們可以看到,vector可以設定增長的值。public vector int initialcapacity,int capacityincr...
vector 1 5倍擴容優於2倍擴容的原因
假設我們一開始申請了 16byte 的空間。當需要更多空間的時候,將首先申請 32byte,然後釋放掉之前的 16byte。這釋放掉的16byte 的空間就閒置在了記憶體中。當還需要更多空間的時候,你將首先申請 64byte,然後釋放掉之前的 32byte。這將在記憶體中留下乙個48byte 的閒置...