stl reserve和resize區別
首先我們看下size和capacity的區別
size是當前vector容器真實佔用的大小,也就是容器當前擁有多少個元素。
capacity是指在傳送realloc前 允許的最大元素數,即預分配的記憶體空間。
注:在STL中,擁有capacity屬性的容器只有vector和string
這兩個屬性分別對應兩個方法:resize()和reserve()
a.reserve是容器預留空間,但並不真正建立元素物件,不能引用容器內的元素,因此當加入新的元素時,需要用push_back()和insert()函式。
b.resize是改變容器的大小,並且建立物件,因此呼叫這個函式之後,就可以引用容器內的物件了,因此當新加入新元素時候,用operator[]操作符,或者用迭代器來引用元素物件。
再者,兩個函式的形式是有區別的,reserve函式之後一個引數,即需要預留的容器的空間;resize函式可以有兩個引數,第一個引數時容器新的大小,第二個引數是要加入容器中的元素,如果這個引數被忽略,那麼就呼叫元素物件的預設建構函式。下面是這兩個函式的使用例子:
<span style="font-family:FangSong_GB2312;font-size:12px;">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;</span>
初次接觸這兩個介面也許會混淆,其實介面的命名就是對功能的絕佳描述,resize就是重新分配大小,reserve就是預留一定的空間。這兩個介面即存在差別,也有共同點。下面就它們的細節進行分析。
為實現resize的語義,resize介面做了兩個保證:
1.保證區間[0,new_size)範圍內資料有效,如果下標index在此區間內,vector[index]是合法的;
2.保證區間[0,new_size)範圍以外資料無效,如果下標index在區間外,vector[index]是非法的。
reserve只是保證vector的空間大小(capacity)最少達到它的引數所指定的大小n。在區間[0,n)範圍內,如果下標是index,vector[index]這種訪問有可能是合法的,也有可能是非法的,視具體情況而定。
我們使用STL容器的時候,它們能夠自動進行容量擴充,所以在一定程度上,我們是不需要去考慮它們的資源分配的。
需要注意的有兩點:
1、當我們知道容器中存放元素的大致數量時,可以通過reserve()方法減少系統對容器進行資源再分配的次數;
2、當我們能夠確定容器中存放元素的最大數量後,可以通過reserve()修剪超額資源,減少不必要開銷