【C++基金會 04】vector詳細解釋

來源:互聯網
上載者:User

標籤:

根據寫部落格開始總有一些事情的習慣,加雞湯文,今天請原諒我記得。

=============================================


今天要寫的內容是順序型容器。首先,標準庫定義了三種順序容器類型:vector,list和deque(雙端隊列),這篇部落格介紹的是vector容器。

首先要知道。vector不是一種資料類型,而是一個類模板,能夠用來定義隨意多種資料類型。比方說vector<int>是一種資料類型。vector<string>也是一種資料類型。使用vector之前我們要先包括標頭檔

#include<vector>using std::vector;

1.vector初始化

vector<T> v1;       //初始化一個為空白的vectorvector<T> v2(v1);   //v2是v1的一個副本vector<T> v3(n,i);  //n個值為i的vectorvector<T> v4(n);    //v4含n個預設初始化值的vector(如int預設0。string預設"")

2.迭代器

每一個標準庫容器類型都定義了名為iterator的成員。也就是迭代器。迭代器所指向的類型為vector容器中實際儲存的類型,比方

vector<int>iterator iter;
迭代器經常使用於遍曆容器。 最常見的便是begin和end操作,vector.begin()返回vector中的第一個元素,vector.end()返回末端元素的下一個。

vector<int> ivec;for(int i = 0; i <= 10; i++)  ivec.push_back(i);for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter){  *iter = 0;   //遍曆vector,更改值為0}
須要注意的是,假設有元素加入或者刪除,會使迭代器失效,從而須要調整迭代器的值。否則非常可能會導致執行時崩潰。者點非常重要。

3.vector的經常使用操作

加入:須要注意的是加入新元素可能會使迭代器失效,所以程式須要保證迭代器在插入或者push操作後能得到更新。

//加入元素v.push_back(t);               //在vector尾部加入一個元素tv.insert(iter,t);            //在迭代器iter所指向的元素前面插入元素t,返回新加入的元素的迭代器v.insert(iter,n,t);          //在迭代器iter所指向的元素前面插入n個元素t,返回voidv.insert(iter,iter1,iter2);  //在迭代器iter所指向的元素前面插入迭代器[iter1,iter2)之間的元素(左閉右開)。返回void

全部容器類型都支援關係操作符來比較大小,規則是:

//v1和v2長度和全部元素都相等。則v1=v2,否則不等。

//v1長度小於v2,可是v1全部元素和v2 相等,則 v1 < v2。//v1和v2元素不等,則比較結果取決於第一個不相等的元素。

vector大小的操作:

v.size();      //返回v中元素的個數,傳回型別 v::size_typev.max_size();  //返回v可容納最多元素個數v.empty();     //推斷是否為空白v.resize(n);   //調整v長度大小,使其能容納n個元素。假設n<v.size(),則刪除多出來的元素,否則加入採用值初始化的元素v.resize(n,t); //調整v長度大小,使其能容納n個元素,全部新加入的元素值都為t

vector訪問:

v.back();   //返回v最後一個元素的引用v.front();  //返回v第一個元素的引用v[n];       //返回v下標為n的引用v.at[n];    //返回v下標為n的引用//返回的是引用,注意和迭代器的差別,迭代器返回的是指標vector<int> v;//迭代器vector<int>::iterator iter = v.begin();//引用,以下val = val2vector<int>::reference val = v.front();vector<int>::reference val2 = *v.begin();
vector刪除操作:

v.erase(iter);        //刪除iter所指向的元素,返回iter下一個元素v.erase(iter1,iter2); //刪除[iter1,iter2)之間的元素(左閉右開)v.clear();            //全刪,返回voidv.pop_back();         //刪除最後一個。返回void

賦值操作:

v1 = v2;                //複製v2到v1v1.swap(v2);            //交換內容:交換v1和v2之間的元素,速度比v2拷貝到v1快v1.assign(iter1,iter2); //又一次設定:將[iter1,iter2)之間的元素(左閉右開)拷貝到v中v1.assign(n,t);         //又一次設定:將v中又一次設定為n個值為t的元素
注意swap不會使迭代器失效。

assign會將vector中全部元素刪除,然後再插入新元素。assing能夠用於:同樣或者不同的容器內,元素類型不同可是相互相容之間的轉換賦值。(比方vector<char*>和list<string>之間的賦值)

vector<char*> v1;for(int i = 0; i <= 10; i++)  v1.push_back("dddd");list<string> list1;list1.assign(v1.begin(),b1.end());

4.vector容器自增長

首先要明確vector容器的元素在記憶體中是以連續的方式存放。

想一下假設加入新元素的時候時候已經沒有空間來容納新元素,又不能隨便找個地兒來放新元素。所以須要又一次分配vector的儲存空間:copy舊元素到新儲存空間。插入新元素。刪除舊儲存空間。

假設vector在每次加入新元素的時候都這麼搞一個,那效率何在?所以。顯然vector設計的時候也考慮到這方面的問題,作者使用的記憶體配置策略是:以最小的代價連續儲存元素。

用通俗大大白話來講,就是每次分配的時候會比你當前所須要的空間多一些,當已經分配的空間使用完後才會開闢新的空間。

首先來看一下capacity和reserve操作

v.size();     //返回vector中元素的個數v.capacity(); //返回vector可以儲存的元素總數v.reserve(n); //手動設定vector容器應該預留n個元素的空間
舉一個簡單的範例來說明他們之間的關係:

vector<int> v;cout<<"vector size:"<<v.size()<<endl;        //輸出0cout<<"vector capacity:"<<v.capacity()<<endl;//輸出0//加入24個元素for(int i = 0; i < 24; i++)  v.push_back(i);cout<<"vector size:"<<v.size()<<endl;        //輸出24cout<<"vector capacity:"<<v.capacity()<<endl;//輸出32
明確了吧。 capacity總是要大於或等於size的。至於為什麼是32?由於每當vector不得不分配新的儲存空間時,會以加倍當前容量 的分配策略來又一次分配。比方你加入1個元素。size為1,capacity也為1,然後再加入,capacity 乘2,然後再加入再乘2。例如以下:

//加入的時候size和capacity的關係://v.size() —— v.capacity()        0  -  0        1  -  1        2  -  2        3  -  4        4  -  4        5  -  8        9  -  16        以此類推...
或者我們能夠自己設定預留空間,改動上面的範例:

vector<int> v;v.reserve(50);cout<<"vector size:"<<v.size()<<endl;        //輸出0cout<<"vector capacity:"<<v.capacity()<<endl;//輸出50//加入50個元素for(int i = 0; i < 50; i++)  v.push_back(i);//再多加入一個v.push_back(51);cout<<"vector size:"<<v.size()<<endl;        //輸出51cout<<"vector capacity:"<<v.capacity()<<endl;//輸出100

5.容器優缺點:

vector:長處:高速隨機訪問

缺點:在容器任何位置插入或刪除,比在容器尾部插入或刪除,開銷大。

list:是不連續儲存的,長處:在容器中不論什麼位置高效的插入和刪除元素。

缺點:不支援隨機訪問。訪問元素須要遍曆其它元素。

deuqe :擁有更複雜的資料結構。長處:從容器兩端插入和刪除都非常快,支援高效隨機訪問。缺點:在中間插入或刪除效率非常低。

6.推斷選擇哪種容器:

(1)須要高效隨機訪問元素,則使用vector或者deque。

(2)須要高效在容器中間位置插入或者刪除元素,則使用list。

(3)若不是在中間位置插入,而是容器首部或者尾部插入,則使用deque。

(4)若既須要高效隨機訪問又須要高效中間插入,則能夠將元素加入到list中然後排序啥的。再拷貝到vector中。


=========================================


再不睡覺就作死了。。


轉載請註明出處:http://blog.csdn.net/shun_fzll/article/details/37917133


著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。

【C++基金會 04】vector詳細解釋

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.