關于vector的常見用法詳解
vector翻譯為向量,但是這里使用“變長數(shù)組”的叫法更容易理解,也即“長度根據(jù)需要而自動改變的數(shù)組”。在考試題中,有時會碰到只用普通數(shù)組會超內存的情況,這種情況使用vector會讓問題的解決便捷許多。另外, vector還可以用來以鄰接表的方式儲存圖,這對無法使用鄰接矩陣的題目(結點數(shù)太多)、又害怕使用指針實現(xiàn)鄰接表的讀者是非常友好的寫法也非常簡潔。
需要的頭文件:
#include <vector>
需要的其他東西:
using namespace std;
vector的定義
vector的定義的格式:
vector<typename> name;
上面這個定義其實相當于是一維數(shù)組name[ SIZE ],只不過其長度可以根據(jù)需要進行變化,
比較節(jié)省空間,說通俗了就是"邊長數(shù)組"。
和一維數(shù)組一樣,這里的typename 可以是任何基本類型,例如: int 、double 、char、結構體等,也可以是STL標準容器,
例如 vector 、set、queue等。需要注意的是,如果typename也是一個STL容器,定義的時候要記得在 >> 符號之間加上空格,
因為一些使用C++ 11之前標準的編譯器會把它視為移位操作,導致編譯錯誤。
例子:
#include<cstdio> #include<vector> using namespace std; struct student { int age; char name[20]; }; int main(void) { vector<int> a; vector<double> b; vector<char> c; vector<student> d; return 0; }
如果typename 是vector,就是下面這樣定義:
vector< vector<int> > name;// >>之間要加空格
可以很容易聯(lián)想到二維數(shù)組的定義,即其中一維是一個數(shù)組的數(shù)組。那么二維vector數(shù)組也是一樣的,
即Arrayname[]中的每一個元素都是vector。
初學者可以把二維vector 數(shù)組當作兩個維都可變長的二維數(shù)組理解。
定義vector數(shù)組的方法:
vector<typename> Arrayname[arraySize];
這樣Arrayname[0] ~ Arrayname[ arraySize - 1 ] 中的每一個元素都是一個vector容器。
與vector<vector<int> > name 不同的是,這種寫法的一維長度已經(jīng)固定為arraySize,另一維才是"變長"的
vector容器內元素的訪問
vector一般有兩種訪問方式 , 通過下標訪問或通過迭代器訪問。
一、通過下標訪問
和訪問普通的數(shù)組是一樣的,對一個定義為vector vi 的容器來說
直接訪問vi[ index ] 即可(如vi[0]、vi[1])。當然這里的下標是從0 到 vi.size()-1。
訪問這個范圍外的元素可能會出錯。
二、通過迭代器訪問
迭代器( iterator ) 可以理解為一種類似指針的東西,其定義是:
vector<typename>::iterator it; //可以迭代器就是定義一個 vector類型的指針 vector<typename>::iterator it; //可以迭代器就是定義一個 vector類型的指針
這樣it 就是一個vector:: iterator型的變量,其中 typename 就是定義vector時填寫的類型。
下面是typename為int和 double 類型的舉例:
vector<int> ::iterator it; vector<double> ::iterator it;
這樣就得到了迭代器it,并且可以通過 *it 來訪問vector里的元素
從這里可以看出 vi [ i ] 和 * ( vi.begin() + i )是等價的。
上面中的begin()函數(shù)的作用為 : 取 a的首元素地址。
end()函數(shù)是取a的尾元素地址的下一個地址。end()作為迭代器末尾標志,不存儲任何元素。
除此之外,迭代器還實現(xiàn)了兩種自加操作: ++it 和 it++
于是有了另一種遍歷vector中元素的寫法:
需要注意的是: vector的迭代器不支持 it < v1.end() 寫法,因此循環(huán)條件只能用 it != vi.end()
最后需要指出,在常用STL容器中,只有在vector和string中,才允許使用vi.begin()+3這種迭代器加上整數(shù)的寫法。
vector常用函數(shù)
(1) push_back()
顧名思義,push_back(x)就是在vector后面添加一個元素x,時間復雜度為O(1)。
(2) pop_back()
pop_back()用以刪除vector的尾元素,時間復雜度為O(1)。
注意: pop_back()函數(shù)是沒有參數(shù)的
(3) size()
size()用來獲得vector中元素的個數(shù),時間復雜度為O(1)。size()返回的是unsigned類型,
不過一般來說用%d不會出很大問題,這一點對所有STL容器都是一樣的。
例子:
(4) clear()
clear()用來清空vector中的所有元素,時間復雜度為O(N),其中N為vector中元素的個數(shù)。
(5) insert()
inesrt(it,x)用來向vector的任意迭代器it處插入一個元素x,時間復雜度O(N)。
(6)erase()
erase()有兩種方法: 刪除單個元素、刪除一個區(qū)間內的所有元素。時間復雜度都為O(N)。
①刪除單個元素
erase(it) 即刪除迭代器為it處的元素。
②刪除一個區(qū)間內的所有元素
erase(first,last)即刪除 [ first , last) 內的所有元素。
上面的說法可以直到,如果要刪除這個vector內的所有元素,
正確的寫法應該是v1.erase( v1.begin() , v1.end() )。
這正如前面說過,v1.end()就是尾元素地址的下一個地址。
當然,更方便的清空vector的方法是使用v1.clear()。
vector的常見用途
(1)存儲數(shù)據(jù)
- vector本身可以作為數(shù)組使用,而且在一些元素個數(shù)不確定的場合可以很好地節(jié)省空間。
- 有些場合需要根據(jù)一些條件把部分數(shù)據(jù)輸出在同一行,數(shù)據(jù)中間用空格隔開。
- 由于輸出數(shù)據(jù)的個數(shù)不確定的,為了更方便地處理最后一個滿足條件地數(shù)據(jù)后面不輸出額外地空格,可以先用vector記錄所有需要輸出的數(shù)據(jù),然后一次輸出。
(2)用鄰接表存儲圖
使用vector實現(xiàn)鄰接表可以讓一些對指針不太熟悉的讀者有一個比較方便的寫法。
到此這篇關于vector的常見用法詳解的文章就介紹到這了,更多相關vector的常見用法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++中用substr()函數(shù)消除前后空格的解決方法詳解
本篇文章是對C++中用substr()函數(shù)消除前后空格的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05