2.3 數(shù)據(jù)結(jié)構(gòu)
STL 的 vector 在開始為數(shù)組開辟較小的空間努酸,然后往數(shù)組中添加數(shù)據(jù)啦吧。當(dāng)數(shù)據(jù)的數(shù)目超過了數(shù)組的容量的時(shí)候讼溺,重新分配一塊新的更大的空間轧邪。每次擴(kuò)充容量的時(shí)候,新的容量是前一次的 1.5 倍 (VS) 或 2 倍 (GCC)举庶。看這個(gè)鏈接了解為什么是這樣子擴(kuò)張执隧。把之前的數(shù)據(jù)復(fù)制到新的數(shù)組中,然后把之前的內(nèi)存釋放灯变。
-
當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞的時(shí)候殴玛,數(shù)組就會(huì)自動(dòng)退化成同類型的指針:
int getSize(int data[]) { return sizeof(data); } int main() { int a[] = {1, 2, 3, 4, 5}; cout << getSize(a) << endl; //4 return 0; }
遞歸的代碼看起來很簡(jiǎn)潔,但是有一個(gè)問題:每一次調(diào)用函數(shù)添祸,都需要在棧中分配空間以保存參數(shù)滚粟、返回地址以及臨時(shí)變量。由于每個(gè)進(jìn)程被分配的椚忻冢空間是有限的凡壤,所以當(dāng)調(diào)用層級(jí)很深的時(shí)候,可能導(dǎo)致該進(jìn)程的函數(shù)調(diào)用棧溢出耙替。而且往棧中壓入數(shù)據(jù)和彈出數(shù)據(jù)都需要時(shí)間亚侠。所以一般來說非遞歸的代碼要比遞歸代碼的效率高一點(diǎn)。