關(guān)于vector的常見用法詳解
vector翻譯為向量,但是這里使用“變長數(shù)組”的叫法更容易理解,也即“長度根據(jù)需要而自動(dòng)改變的數(shù)組”。在考試題中,有時(shí)會(huì)碰到只用普通數(shù)組會(huì)超內(nèi)存的情況,這種情況使用vector會(huì)讓問題的解決便捷許多。另外, vector還可以用來以鄰接表的方式儲(chǔ)存圖,這對(duì)無法使用鄰接矩陣的題目(結(jié)點(diǎn)數(shù)太多)、又害怕使用指針實(shí)現(xiàn)鄰接表的讀者是非常友好的寫法也非常簡潔。
需要的頭文件:
#include <vector>
需要的其他東西:
using namespace std;
vector的定義
vector的定義的格式:
vector<typename> name;
上面這個(gè)定義其實(shí)相當(dāng)于是一維數(shù)組name[ SIZE ],只不過其長度可以根據(jù)需要進(jìn)行變化,
比較節(jié)省空間,說通俗了就是"邊長數(shù)組"。
和一維數(shù)組一樣,這里的typename 可以是任何基本類型,例如: int 、double 、char、結(jié)構(gòu)體等,也可以是STL標(biāo)準(zhǔn)容器,
例如 vector 、set、queue等。需要注意的是,如果typename也是一個(gè)STL容器,定義的時(shí)候要記得在 >> 符號(hào)之間加上空格,
因?yàn)橐恍┦褂肅++ 11之前標(biāo)準(zhǔn)的編譯器會(huì)把它視為移位操作,導(dǎo)致編譯錯(cuò)誤。
例子:
#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ù)組的定義,即其中一維是一個(gè)數(shù)組的數(shù)組。那么二維vector數(shù)組也是一樣的,
即Arrayname[]中的每一個(gè)元素都是vector。
初學(xué)者可以把二維vector 數(shù)組當(dāng)作兩個(gè)維都可變長的二維數(shù)組理解。
定義vector數(shù)組的方法:
vector<typename> Arrayname[arraySize];

這樣Arrayname[0] ~ Arrayname[ arraySize - 1 ] 中的每一個(gè)元素都是一個(gè)vector容器。
與vector<vector<int> > name 不同的是,這種寫法的一維長度已經(jīng)固定為arraySize,另一維才是"變長"的
vector容器內(nèi)元素的訪問
vector一般有兩種訪問方式 , 通過下標(biāo)訪問或通過迭代器訪問。
一、通過下標(biāo)訪問
和訪問普通的數(shù)組是一樣的,對(duì)一個(gè)定義為vector vi 的容器來說
直接訪問vi[ index ] 即可(如vi[0]、vi[1])。當(dāng)然這里的下標(biāo)是從0 到 vi.size()-1。
訪問這個(gè)范圍外的元素可能會(huì)出錯(cuò)。

二、通過迭代器訪問
迭代器( iterator ) 可以理解為一種類似指針的東西,其定義是:
vector<typename>::iterator it; //可以迭代器就是定義一個(gè) vector類型的指針 vector<typename>::iterator it; //可以迭代器就是定義一個(gè) vector類型的指針
這樣it 就是一個(gè)vector:: iterator型的變量,其中 typename 就是定義vector時(shí)填寫的類型。
下面是typename為int和 double 類型的舉例:
vector<int> ::iterator it; vector<double> ::iterator it;
這樣就得到了迭代器it,并且可以通過 *it 來訪問vector里的元素

從這里可以看出 vi [ i ] 和 * ( vi.begin() + i )是等價(jià)的。
上面中的begin()函數(shù)的作用為 : 取 a的首元素地址。
end()函數(shù)是取a的尾元素地址的下一個(gè)地址。end()作為迭代器末尾標(biāo)志,不存儲(chǔ)任何元素。
除此之外,迭代器還實(shí)現(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后面添加一個(gè)元素x,時(shí)間復(fù)雜度為O(1)。

(2) pop_back()
pop_back()用以刪除vector的尾元素,時(shí)間復(fù)雜度為O(1)。
注意: pop_back()函數(shù)是沒有參數(shù)的

(3) size()
size()用來獲得vector中元素的個(gè)數(shù),時(shí)間復(fù)雜度為O(1)。size()返回的是unsigned類型,
不過一般來說用%d不會(huì)出很大問題,這一點(diǎn)對(duì)所有STL容器都是一樣的。
例子:

(4) clear()
clear()用來清空vector中的所有元素,時(shí)間復(fù)雜度為O(N),其中N為vector中元素的個(gè)數(shù)。

(5) insert()
inesrt(it,x)用來向vector的任意迭代器it處插入一個(gè)元素x,時(shí)間復(fù)雜度O(N)。

(6)erase()
erase()有兩種方法: 刪除單個(gè)元素、刪除一個(gè)區(qū)間內(nèi)的所有元素。時(shí)間復(fù)雜度都為O(N)。
①刪除單個(gè)元素
erase(it) 即刪除迭代器為it處的元素。


②刪除一個(gè)區(qū)間內(nèi)的所有元素
erase(first,last)即刪除 [ first , last) 內(nèi)的所有元素。

上面的說法可以直到,如果要?jiǎng)h除這個(gè)vector內(nèi)的所有元素,
正確的寫法應(yīng)該是v1.erase( v1.begin() , v1.end() )。
這正如前面說過,v1.end()就是尾元素地址的下一個(gè)地址。
當(dāng)然,更方便的清空vector的方法是使用v1.clear()。
vector的常見用途
(1)存儲(chǔ)數(shù)據(jù)
- vector本身可以作為數(shù)組使用,而且在一些元素個(gè)數(shù)不確定的場(chǎng)合可以很好地節(jié)省空間。
- 有些場(chǎng)合需要根據(jù)一些條件把部分?jǐn)?shù)據(jù)輸出在同一行,數(shù)據(jù)中間用空格隔開。
- 由于輸出數(shù)據(jù)的個(gè)數(shù)不確定的,為了更方便地處理最后一個(gè)滿足條件地?cái)?shù)據(jù)后面不輸出額外地空格,可以先用vector記錄所有需要輸出的數(shù)據(jù),然后一次輸出。
(2)用鄰接表存儲(chǔ)圖
使用vector實(shí)現(xiàn)鄰接表可以讓一些對(duì)指針不太熟悉的讀者有一個(gè)比較方便的寫法。
到此這篇關(guān)于vector的常見用法詳解的文章就介紹到這了,更多相關(guān)vector的常見用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入const int *p與int * const p的區(qū)別詳解(常量指針與指向常量的指針)
本篇文章是對(duì)const int *p與int * const p的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
C++ for循環(huán)與nullptr的小知識(shí)點(diǎn)分享
這篇文章主要是來和大家介紹一些C++中的小知識(shí)點(diǎn),本文分享的是for循環(huán)與nullptr,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-05-05
C++ vector的介紹及常見功能實(shí)現(xiàn)
這篇文章主要介紹了C++ vector的介紹及模擬實(shí)現(xiàn),vector在實(shí)際中非常的重要,但在實(shí)際中我們只要熟悉常見的接口就可以了,最重要的是理解他的底層原理,要能夠自己模擬實(shí)現(xiàn)出一個(gè)簡單的vector,本文結(jié)合示例代碼給大家詳細(xì)介紹,需要的朋友可以參考下2023-05-05
C++ OpenCV實(shí)戰(zhàn)之制作九宮格圖像
本文將為大家介紹如何使用OpenCV C++ 制作九宮格圖像,即將一張圖像均等分成九份,然后將這九個(gè)小塊按一定間隔拷貝到新畫布上就可以啦。感興趣的可以動(dòng)手試一試2022-01-01
一文學(xué)會(huì)數(shù)據(jù)結(jié)構(gòu)-堆
本文主要介紹了數(shù)據(jù)結(jié)構(gòu)-堆,文中通過圖片和大量的代碼講解的非常詳細(xì),需要學(xué)習(xí)的朋友可以參考下這篇文章,希望可以幫助到你2021-08-08

