C++
內建的數組支援容器的機制,但是它不支援容器抽象的語義。要解決此問題我們自己實現這樣的類。在標準C++中,用容器向量(vector)實現。容器向量
也是一個類模板。
標準庫vector類型使用需要的標頭檔:#include <vector>。vector
是一個類模板。不是一種資料類型,vector<int>是一種資料類型。Vector的儲存空間是連續的,list
不是連續儲存的
。
一、 定義和初始化
vector< typeName > v1; //預設v1為空白,故下面的賦值是錯誤的v1[0]=5;
vector<typeName>v2(v1); 或v2=v1;或vector<typeName>
v2(v1.begin(),
v1.end());//v2是v1的一個副本,若v1.size()>v2.size()則賦值後v2.size()被擴充為
v1.size()。
vector< typeName > v3(n,i);//v3包含n個值為i的typeName類型元素
vector< typeName > v4(n); //v4含有n個值為0的元素
int a[4]={0,1,2,3,3}; vector<int>
v5(a,a+5);//v5的size為5,v5被初始化為a的5個值。後一個指標要指向將被拷貝的末元素的下一位置。
vector<int> v6(v5);//v6是v5的拷貝
vector< 類型 > 標識符(最大容量,初始所有值);
二、 值初始化
1> 如果沒有指定元素初始化式,標準庫自行提供一個初始化值進行值初始化。
2> 如果儲存的式含有建構函式的類類型的元素,標準庫使用該類型的建構函式初始化。
3> 如果儲存的式沒有建構函式的類類型的元素,標準庫產生一個帶初始值的對象,使用這個對象進行值初始化。
三、vector對象最重要的幾種操作
1. v.push_back(t)
在容器的最後添加一個值為t的資料,容器的size變大。
另外list有push_front()函數,在前端插入,後面的元素下標依次增大。
2. v.size()
返回容器中資料的個數,size返回相應vector類定義的size_type的值。v.resize(2*v.size)
或
v.resize(2*v.size, 99)
將v的容量翻倍(並把新元素的值初始化為99)
3. v.empty()
判斷vector是否為空白
4. v[n]
返回v中位置為n的元素
5. v.insert
(pointer,number, content)
向v中pointer指向的位置插入number個content的內容。
還有v. insert(pointer,
content),v.insert(pointer,a[2],a[4])將a[2]到a[4]三個元素插入。
6. v.pop_back()
刪除容器的末元素,並不返回該元素。
7.v.erase(pointer1,pointer2)
刪除pointer1到pointer2中間(包括pointer1所指)的元素。
vector中刪除一個元素後,此位置以後的元素都需要往前移動一個位置,雖然當前迭代器位置沒有自動加1,
但是由於後續元素的順次前移,也就相當於迭代器的自動指向下一個位置一樣。
8. v1==v2 判斷v1與v2是否相等。
9. !=、<、<=、>、>= 保持這些操作符慣有含義。
10. vector<typeName>::iterator
p=v1.begin( ); p初始值指向v1的第一個元素。*p取所指向元素的值。
對於const
vector<typeName>只能用vector<typeName>::const_iterator類型的指標訪問。
11. p=v1.end( );
p指向v1的最後一個元素的下一位置。
12.v.clear()
刪除容器中的所有元素。12.v.clear() 刪除容器中的所有元素。