vecotr是動態數組,顧名思義他可以動態的增加自己的長度。
內存機制:
但是怎樣的增加自己的長度?
vector有兩個函數一個是capacity()返回內存空間即緩沖區的大小,另一個是size()返回當前數組中數的數量。vector增加元素來說,當容量已經不能放進數據了,那么他會重新申請一塊內存,把之前的內存利用復制構造函數復制到新的內存當中,然后把新添加的內容放入后面,另外此時的他申請的內存空間是原來空間的2倍,我測得是2倍
緩沖區的釋放
vecotor占用的內存只增不減,erase只是將一段區間( earse(arr.begin(), arr.end() )的值清除掉或者將某個值( erase(x) )清除掉,但是對於內存空間來說是沒變化的
所有內存空間是在vector析構時候才能被系統回收。empty()用來檢測容器是否為空的,clear()可以清空所有元素。但是即使clear(),vector所占用的內存空間依然如故,無法保證內存的回收。
方法一: vecotr<Type>().swap(arr) // 回收arr內存 方法二: 模板: Template < class T > void ClearVector( vector< T >& vt ) { vector< T > vtTemp; veTemp.swap( vt ); } 調用模板函數 void ClearVector<vector< T> & vt) { vector<int> temp;//臨時對象未初始化,其緩沖區大小為0,沒有數據 arr.swap(temp);//與我們的對象交換數據,arr的緩沖區就沒了。 }//臨時變量會被析構,temp調用vector析構函數釋放空間
----------------------------------------------------------------------------
性能分析:
主要比較三種插入方式:
1、直接push_back() 2、 reserve(n) 預定n個空間,當然后續push_back()會增加,其中的值不確定, 3 resize(n, x) 申請n個空間初始化為x,
reserve只是保持一個最小的空間大小,而resize則是對緩沖區進行重新分配,里面涉及到的判斷和內存處理比較多所以比reserve慢一些,對於數據數目可以確定的時候,先預設空間大小是很有必要的。直接push_back數據頻繁移動很是耗時