當前位置:編程學習大全網 - 源碼下載 - vector 在c++中resize 和reserve的區別

vector 在c++中resize 和reserve的區別

resize就是重新分配大小,reserve就是預留壹定的空間。這兩個接口即存在差別,也有***同點。下面就它們的細節進行分析。

為實現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) { resize(new_size, T()); }

void resize(size_type new_size, const T& x) {

if (new_size < size())

erase(begin() + new_size, end()); // erase區間範圍以外的數據,確保區間以外的數據無效

else

insert(end(), new_size - size(), x); // 填補區間範圍內空缺的數據,確保區間內的數據有效

}

void reserve(size_type n) {

if (capacity() < n) {

const size_type old_size = size();

iterator tmp = allocate_and_copy(n, start, finish);

destroy(start, finish);

deallocate();

start = tmp;

finish = tmp + old_size;

end_of_storage = start + n;

}

}

二、/t/20050121/10/3742864.html

vector在push_back的時候,如果空間不足,會自動增補壹些空間,如果沒有預留的空間可用

就直接申請另壹塊可用的連續的空間,把數據拷貝過去,然後刪除舊空間,使用新空間

結果造成效率低下

如果在事先預見到有較大空間需求,就可以先用reserve預留壹定的空間,避免內存重復分配和

大量的數據搬移。提高了效率

size指的是除去預留的額外空間的所有用來存放數據的空間,resize也好理解,如果說妳對某部分

沒有進行初始化(比如原本的size是100,現在resize為200個),那就給其余100個調用默認構造函數,

如果是內置類型,初始化為0——我對初始化內置類型這點不是特別肯定,妳可以查資料).

capacity返回的是包括預留的空間在內的所有空間大小,通常跟reserve的那個大小相當,否則根據分配策略獲得。capacity的正式定義為:在不需要重新分配空間的情況下,vector能容納的元素的最大數量

舉例說:

vector <int> v;

v.reserve(16);

assert(v.capacity()==16);

vector <int> v;

cout < < v.capacity(); //這裏就依賴於庫的實現,

  • 上一篇:怎麽用c語言打開壹個MP3文件(直接給代碼),需要什麽軟件進行輸入
  • 下一篇:請問如何清除數據庫js病毒
  • copyright 2024編程學習大全網