轉自https://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html
https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html
一、向量的介紹
向量 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 }
此外:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html
三、基本函數實現
1.構造函數
- vector():創建一個空vector
- vector(int nSize):創建一個vector,元素個數為nSize
- vector(int nSize,const t& t):創建一個vector,元素個數為nSize,且值均為t
- vector(const vector&):復制構造函數
- vector(begin,end):復制[begin,end)區間內另一個數組的元素到vector中
2.增加函數
- void push_back(const T& x):向量尾部增加一個元素X
- iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一個元素x
- iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n個相同的元素x
- iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一個相同類型向量的[first,last)間的數據
3.刪除函數
- iterator erase(iterator it):刪除向量中迭代器指向元素
- iterator erase(iterator first,iterator last):刪除向量中[first,last)中元素
- void pop_back():刪除向量中最后一個元素
- void clear():清空向量中所有元素
4.遍歷函數
- reference at(int pos):返回pos位置元素的引用
- reference front():返回首元素的引用
- reference back():返回尾元素的引用
- iterator begin():返回向量頭指針,指向第一個元素
- iterator end():返回向量尾指針,指向向量最后一個元素的下一個位置
- reverse_iterator rbegin():反向迭代器,指向最后一個元素
- reverse_iterator rend():反向迭代器,指向第一個元素之前的位置
5.判斷函數
- bool empty() const:判斷向量是否為空,若為空,則向量中無元素
6.大小函數
- int size() const:返回向量中元素的個數
- int capacity() const:返回當前向量張紅所能容納的最大元素值
- int max_size() const:返回最大可允許的vector元素數量值
7.其他函數
- void swap(vector&):交換兩個同類型向量的數據
- void assign(int n,const T& x):設置向量中第n個元素的值為x
- void assign(const_iterator first,const_iterator last):向量中[first,last)中元素設置成當前向量元素
8.看着清楚
1.push_back 在數組的最后添加一個數據
2.pop_back 去掉數組的最后一個數據
3.at 得到編號位置的數據
4.begin 得到數組頭的指針
5.end 得到數組的最后一個單元+1的指針
6.front 得到數組頭的引用
7.back 得到數組的最后一個單元的引用
8.max_size 得到vector最大可以是多大
9.capacity 當前vector分配的大小
10.size 當前使用數據的大小
11.resize 改變當前使用數據的大小,如果它比當前使用的大,者填充默認值
12.reserve 改變當前vecotr所分配空間的大小
13.erase 刪除指針指向的數據項
14.clear 清空當前的vector
15.rbegin 將vector反轉后的開始指針返回(其實就是原來的end-1)
16.rend 將vector反轉構的結束指針返回(其實就是原來的begin-1)
17.empty 判斷vector是否為空
18.swap 與另一個vector交換數據
遞歸器
vector<int>::iterator it;//聲明一個迭代器,變量名為it,來訪問vector容器
for(it=obj.begin();it!=obj.end();it++)
{
cout<<*it<<" ";
}