vecotr是動態數組,顧名思義他能夠動態的增長本身的長度。數組
內存機制:函數
可是怎樣的增長本身的長度?性能
vector有兩個函數一個是capacity()返回內存空間即緩衝區的大小,另外一個是size()返回當前數組中數的數量。vector增長元素來講,當容量已經不能放進數據了,那麼他會從新申請一塊內存,把以前的內存利用複製構造函數複製到新的內存當中,而後把新添加的內容放入後面,另外此時的他申請的內存空間是原來空間的2倍,我測得是2倍spa
緩衝區的釋放code
vecotor佔用的內存只增不減,erase只是將一段區間( earse(arr.begin(), arr.end() )的值清除掉或者將某個值( erase(x) )清除掉,可是對於內存空間來講是沒變化的對象
全部內存空間是在vector析構時候才能被系統回收。empty()用來檢測容器是否爲空的,clear()能夠清空全部元素。可是即便clear(),vector所佔用的內存空間依然如故,沒法保證內存的回收。blog
方法一: 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析構函數釋放空間
----------------------------------------------------------------------------內存
性能分析:ci
主要比較三種插入方式:it
一、直接push_back() 二、 reserve(n) 預約n個空間,固然後續push_back()會增長,其中的值不肯定, 3 resize(n, x) 申請n個空間初始化爲x,
reserve只是保持一個最小的空間大小,而resize則是對緩衝區進行從新分配,裏面涉及到的判斷和內存處理比較多因此比reserve慢一些,對於數據數目能夠肯定的時候,先預設空間大小是頗有必要的。直接push_back數據頻繁移動非常耗時