學習C++ -> 向量(vector)
一、向量的介紹
向量 vector 是一種對象實體, 能夠容納許多其他類型相同的元素, 因此又被稱為容器。 與string相同, vector 同屬於STL(Standard Template Library, 標准模板庫)中的一種自定義的數據類型, 可以廣義上認為是數組的增強版。
在使用它時, 需要包含頭文件 vector, #include<vector>
vector 容器與數組相比其優點在於它能夠根據需要隨時自動調整自身的大小以便容下所要放入的元素。此外, vector 也提供了許多的方法來對自身進行操作。
二、向量的聲明及初始化
vector 型變量的聲明以及初始化的形式也有許多, 常用的有以下幾種形式:
vector<int> a ; //聲明一個int型向量a
vector<int> a(10) ; //聲明一個初始大小為10的向量
vector<int> a(10, 1) ; //聲明一個初始大小為10且初始值都為1的向量
vector<int> b(a) ; //聲明並用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3) ; //將a向量中從第0個到第2個(共3個)作為向量b的初始值
除此之外, 還可以直接使用數組來初始化向量:
int n[] = {1, 2, 3, 4, 5} ; vector<int> a(n, n+5) ; //將數組n的前5個元素作為向量a的初值
vector<int> a(&n[1], &n[4]) ; //將n[1] - n[4]范圍內的元素作為向量a的初值
三、元素的輸入及訪問
元素的輸入和訪問可以像操作普通的數組那樣, 用cin>>進行輸入, cout<<a[n]這樣進行輸出:
示例:
1 #include<iostream> 2 #include<vector> 3 4 using namespace std ; 5 6 int main() 7 { 8 vector<int> a(10, 0) ; //大小為10初值為0的向量a 9 10 //對其中部分元素進行輸入 11 cin >>a[2] ; 12 cin >>a[5] ; 13 cin >>a[6] ; 14 15 //全部輸出 16 int i ; 17 for(i=0; i<a.size(); i++) 18 cout<<a[i]<<" " ; 19 20 return 0 ; 21 }
在元素的輸出上, 還可以使用遍歷器(又稱迭代器)進行輸出控制。在 vector<int> b(a.begin(), a.begin()+3) ; 這種聲明形式中, (a.begin()、a.begin()+3) 表示向量起始元素位置到起始元素+3之間的元素位置。(a.begin(), a.end())則表示起始元素和最后一個元素之外的元素位置。
向量元素的位置便成為遍歷器, 同時, 向量元素的位置也是一種數據類型, 在向量中遍歷器的類型為: vector<int>::iterator。 遍歷器不但表示元素位置, 還可以再容器中前后移動。
在上例中講元素全部輸出部分的代碼就可以改寫為:
//全部輸出
vector<int>::iterator t ; for(t=a.begin(); t!=a.end(); t++) cout<<*t<<" " ;
*t 為指針的間接訪問形式, 意思是訪問t所指向的元素值。
四、向量的基本操作
1>. a.size() //獲取向量中的元素個數
2>. a.empty() //判斷向量是否為空
3>. a.clear() //清空向量中的元素
4>. 復制 a = b ; //將b向量復制到a向量中
5>. 比較 保持 ==、!=、>、>=、<、<= 的慣有含義 ; 如: a == b ; //a向量與b向量比較, 相等則返回1
6>. 插入 - insert ①、 a.insert(a.begin(), 1000); //將1000插入到向量a的起始位置前
②、 a.insert(a.begin(), 3, 1000) ; //將1000分別插入到向量元素位置的0-2處(共3個元素)
③、 vector<int> a(5, 1) ; vector<int> b(10) ; b.insert(b.begin(), a.begin(), a.end()) ; //將a.begin(), a.end()之間的全部元素插入到b.begin()前
7>. 刪除 - erase ①、 b.erase(b.begin()) ; //將起始位置的元素刪除
②、 b.erase(b.begin(), b.begin()+3) ; //將(b.begin(), b.begin()+3)之間的元素刪除
8>. 交換 - swap b.swap(a) ; //a向量與b向量進行交換
五、二維向量
與數組相同, 向量也可以增加維數, 例如聲明一個m*n大小的二維向量方式可以像如下形式:
vector< vector<int> > b(10, vector<int>(5)); //創建一個10*5的int型二維向量
在這里, 實際上創建的是一個向量中元素為向量的向量。同樣可以根據一維向量的相關特性對二維向量進行操作。
例:
1 #include<iostream> 2 #include<vector> 3 4 using namespace std ; 5 6 int main() 7 { 8 vector< vector<int> > b(10, vector<int>(5, 0)) ; 9 10 //對部分數據進行輸入 11 cin>>b[1][1] ; 12 cin>>b[2][2] ; 13 cin>>b[3][3]; 14 15 //全部輸出 16 int m, n ; 17 for(m=0; m<b.size(); m++) //b.size()獲取行向量的大小 18 { 19 for(n=0; n<b[m].size(); n++) //獲取向量中具體每個向量的大小 20 cout<<b[m][n]<<" " ; 21 cout<<"\n" ; 22 } 23 24 return 0; 25 }
同樣, 按照這樣的思路我們還可以創建更多維的向量, 不過維數太多會讓向量變得難以靈活控制, 三維以上的向量還需酌情使用。
--------------------
wid, 2013.01.22
上一篇: 學習C++ -> string類字符串