標籤:
根據寫部落格開始總有一些事情的習慣,加雞湯文,今天請原諒我記得。
=============================================
今天要寫的內容是順序型容器。首先,標準庫定義了三種順序容器類型: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詳細解釋