void reserve (size_type n);
reserver函數用來給vector預分配存儲區大小,即capacity的值 ,但是沒有給這段內存進行初始化。reserve 的參數n是推薦預分配內存的大小,實際分配的可能等於或大於這個值,即n大於capacity的值,就會reallocate內存 capacity的值會大於或者等於n 。這樣,當調用push_back函數使得size 超過原來的默認分配的capacity值時 避免了內存重分配開銷。
需要注意的是:reserve 函數分配出來的內存空間,只是表示vector可以利用這部分內存,但vector不能有效地訪問這些內存空間,訪問的時候就會出現越界現象,導致程序崩潰。
void resize (size_type n);
void resize (size_type n, value_type val);
resize函數重新分配大小,改變容器的大小,並且創建對象
當n小於當前size()值時候,vector首先會減少size()值 保存前n個元素,然后將超出n的元素刪除(remove and destroy)
當n大於當前size()值時候,vector會插入相應數量的元素 使得size()值達到n,並對這些元素進行初始化,如果調用上面的第二個resize函數,指定val,vector會用val來初始化這些新插入的元素
當n大於capacity()值的時候,會自動分配重新分配內存存儲空間。
例子:
#include<algorithm> #include<vector> #include<list> #include<iostream> #include<string> #include<numeric> #include<iterator> using namespace std; int main() { vector<double> v1={2,34,5,65,34,342,23,1,34}; list<string> v2={"a","a","dfd","fd","a"}; int count1=count(v1.begin(),v1.end(),34); cout<<count1<<endl; int count2=count(v2.begin(),v2.end(),"a"); cout<<count2<<endl; cout<<accumulate(v1.begin(),v1.end(),0)<<endl; vector<int> vec; //此時vec為空 //分配預留空間的插入 vec.reserve(10); cout<<vec[0]<<endl; cout<<vec[9]<<endl; fill_n(vec.begin(),10,0); //沒有分配預留空間的插入 //fill_n(back_inserter(vec),10,0); return 0; }