C 中resize和reserve的區別

2021-09-25 04:20:16 字數 2022 閱讀 5995

首先分清楚兩個概念:

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...