為實現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(); //這裏就依賴於庫的實現,