vector中的resize與 reserve


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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM