很多情況下,是可以大致判斷出需要多大容量的。
當不知道長度時,你需要的資料結構,叫動態變長陣列。下文簡稱為動態陣列。也就是C++中的std::vector。
動態陣列的通常定義為
這裡存放的是char型別,存其它型別同樣原理。
其中,capacity表示容量,size表示實際有多少個數據。buf表示指向具體的記憶體。當capacity 為4,size為3時,這時再放一個char,還夠容量放。之後capacity和size都變為4。
這時再需要放一個char, 就已經放不下了。就需要重新分配一個更大的記憶體區間。並且將之前的資料複製到新空間,再釋放掉舊的記憶體空間。通常的策略是將容量翻倍,從4擴大成8。
這個分配新空間,複製資料,釋放舊空間的過程,可以用函式realloc完成。假如在當前位置上還可以擴大容量,realloc就直接在原地擴大記憶體空間,避免了複製資料的開銷。
將動態陣列這個資料結構封裝好。外面就不用再關心具體的記憶體分配過程了,可以一直往裡面放資料。
擴大capacity的策略通常是翻倍。逐漸升上去
而很多情況下,是可以估計到一個最終容量的粗略值的(不用太準確)。動態陣列通常初始化時候,會有一個叫初始容量值的引數。這樣傳進去一個估計值,可以大大減少它重新分配空間的次數。
很多情況下,是可以大致判斷出需要多大容量的。
當不知道長度時,你需要的資料結構,叫動態變長陣列。下文簡稱為動態陣列。也就是C++中的std::vector。
動態陣列的通常定義為
這裡存放的是char型別,存其它型別同樣原理。
其中,capacity表示容量,size表示實際有多少個數據。buf表示指向具體的記憶體。當capacity 為4,size為3時,這時再放一個char,還夠容量放。之後capacity和size都變為4。
這時再需要放一個char, 就已經放不下了。就需要重新分配一個更大的記憶體區間。並且將之前的資料複製到新空間,再釋放掉舊的記憶體空間。通常的策略是將容量翻倍,從4擴大成8。
這個分配新空間,複製資料,釋放舊空間的過程,可以用函式realloc完成。假如在當前位置上還可以擴大容量,realloc就直接在原地擴大記憶體空間,避免了複製資料的開銷。
將動態陣列這個資料結構封裝好。外面就不用再關心具體的記憶體分配過程了,可以一直往裡面放資料。
擴大capacity的策略通常是翻倍。逐漸升上去
而很多情況下,是可以估計到一個最終容量的粗略值的(不用太準確)。動態陣列通常初始化時候,會有一個叫初始容量值的引數。這樣傳進去一個估計值,可以大大減少它重新分配空間的次數。