因為vector是按照順序的方式存儲元素的,所以通過預分配策略減少內存的申請轧拄。
vector管理內存的函數包括:
reserve和resize
reserve是容器預留空間,但并不真正創(chuàng)建元素對象,在創(chuàng)建對象之前卢佣,不能引用容器內的元素,因此當加入新的元素時箭阶,需要用push_back()/insert()函數虚茶。
resize是改變容器的大小,并且創(chuàng)建對象仇参,因此嘹叫,調用這個函數之后,就可以引用容器內的對象了诈乒,因此當加入新的元素時罩扇,用operator[]操作符,或者用迭代器來引用元素對象怕磨。
再者喂饥,兩個函數的形式是有區(qū)別的,reserve函數之后一個參數肠鲫,即需要預留的容器的空間员帮;resize函數可以有兩個參數,第一個參數是容器新的大小导饲,第二個參數是要加入容器中的新元素捞高,如果這個參數被省略,那么就調用元素對象的默認構造函數.
vector<int> myVec;
myVec.reserve( 100 ); // 新元素還沒有構造,
// 此時不能用[]訪問元素
for (int i = 0; i < 100; i++ ){
myVec.push_back( i ); //新元素這時才構造
}
myVec.resize( 102 ); // 用元素的默認構造函數構造了兩個新的元素
myVec[100] = 1; //直接操作新元素
myVec[101] = 2;
capacity和size
capacity是指不分配新的內容空間的前提下渣锦,可以保存多少元素硝岗。
size是指顯示當前已經保存的元素數量。
shrink_to_fit
由于vector的內存占用空間只增不減袋毙,比如你首先分配了10,000個字節(jié)辈讶,然后erase掉后面9,999個,留下一個有效元素娄猫,但是內存占用仍為10,000個贱除。所有內存空間是在vector析構時候才能被系統(tǒng)回收生闲。
一般可以采用swap來釋放空間:
vector<Point>().swap(pointVec); //或者pointVec.swap(vector<Point> ())
還有一種新方法,即采用shrink_to_fit來收縮容量使之盡可能小的符合當前數據所需月幌。