首先分清楚兩個概念:
1.capacity:該值在容器初始化時賦值,指的是容器能夠容納的最大的元素的個數。還不能通過下標等訪問,因為此時容器中還沒有建立任何物件。
2.size:指的是此時容器中實際的元素個數。可以通過下標訪問0-(size-1)範圍內的物件。
就比如說乙個瓶子的容量是600ml,意思是它最多可以裝600ml,而不是說現在瓶子裡就有600ml,這裡的600ml就相當於capacity;而說現在瓶子的size為300ml,就是說它真的裝有300ml。
那麼就可以分清楚resize和reserve的區別了:
reserve是設定了capacity的值,比如reserve(20),表示該容器最大容量為20,但此時容器內還沒有任何物件,也不能通過下標訪問。
resize既分配了空間,也建立了物件,可以通過下標訪問。當resize的大小
reserve只修改capacity大小,不修改size大小,resize既修改capacity大小,也修改size大小。
reserve是容器預留空間,但並不真正建立元素物件,在建立物件之前,不能引用容器內的元素,因此當加入新的元素時,需要用push_back()/insert()函式。
resize是改變容器的大小,並且建立物件,因此,呼叫這個函式之後,就可以引用容器內的物件了,因此當加入新的元素時,用operator操作符,或者用迭代器來引用元素物件。
再者,兩個函式的形式是有區別的,reserve函式之後乙個引數,即需要預留的容器的空間;resize函式可以有兩個引數,第乙個引數是容器新的大小,第二個引數是要加入容器中的新元素,如果這個引數被省略,那麼就呼叫元素物件的預設建構函式。
這兩個介面即存在差別,也有共同點。下面就它們的細節進行分析。
為實現resize的語義,resize介面做了兩個保證:
一是保證區間[0, new_size)範圍內資料有效,如果下標index在此區間內,vector[indext]是合法的。
二是保證區間[0, new_size)範圍以外資料無效,如果下標index在區間外,vector[indext]是非法的。
reserve只是保證vector的空間大小(capacity)最少達到它的引數所指定的大小n。在區間[0, n)範圍內,如果下標是index,vector[index]這種訪問有可能是合法的,也有可能是非法的,視具體情況而定。
resize和reserve介面的共同點是它們都保證了vector的空間大小(capacity)最少達到它的引數所指定的大小。
因兩介面的源**相當精簡,以至於可以在這裡貼上它們:
void resize(size_type new_size)
void resize(size_type new_size, const t& x)
如下例子:
#include#includeusing namespace std;
int main()
{ vectora;
cout<
b.reserve(100);
cout<
需要注意的是:
對於resize:
如果n比當前的vector元素數目要小,vector的容量要縮減到resize的第乙個引數大小,既n。並移除那些超出n的元素同時銷毀他們。
如果n比當前vector元素數目要大,在vector的末尾擴充套件需要的元素數目,如果第二個引數val指定了,擴充套件的新元素初始化為val的副本,否則按型別預設初始化。
注意:如果n大於當前的vector的容量(是容量,並非vector的size),將會引起自動記憶體分配。所以現有的pointer,references,iterators將會失效。而記憶體的重新配置會很耗時間。
參考:
容器中 reserve和resize
vector 的reserve增加了vector的capacity,但是它的size沒有改變!而 resize 改變了vector的capacity 同時也增加了它的size!原因如下 reserve是容器預留空間,但在空間內不真正建立元素物件,所以在沒有新增新的物件之前,不能引用容器內的元素。加入...
js中resize多次執行
參考 總是延遲1s 最好0.5秒左右 執行最後一次的resize。var timer null window.addeventlistener resize function timer settimeout function 1000 注 只有在拖拽視窗完成後才會改變echarts的大小!如果過程...
HashMap中的resize問題
在jdk1.8中,hashmap的resize 函式做了相應的調整,尤其是對於在buckets的鍊錶中,官方給出的該resize 函式主要在兩種情況下使用 初始化的時候 將雜湊表擴容成之前的兩倍時 下面首先看初始化時,實際的resize 函式做了哪些工作 final node resize node...