STL中vector的使用你了解嗎
前言
當(dāng)我們使用C語(yǔ)言的語(yǔ)法來(lái)實(shí)現(xiàn)數(shù)組的時(shí)候,增刪查改都需要自己來(lái)定義函數(shù),STL中給出了數(shù)組模板vector,其中包含函數(shù)可以幫助我們更便捷地處理數(shù)組。
1.vector是什么
1.vector是一個(gè)表示可變大小數(shù)組的容器。
2.vector采用連續(xù)存儲(chǔ)空間來(lái)進(jìn)行元素的存儲(chǔ)。
3.vector使用動(dòng)態(tài)分配數(shù)組來(lái)存儲(chǔ)它的元素。
2.vector創(chuàng)建對(duì)象
以下為vector的四種拷貝構(gòu)造函數(shù)。
vector<int> v1;//創(chuàng)建空對(duì)象v1
vector<int> v2(10, 8);//創(chuàng)建有十個(gè)8的對(duì)象v2
vector<int> v3(++v2.begin(), --v2.end());//通過(guò)迭代器進(jìn)行拷貝構(gòu)造,迭代器可以加減操作
vector<int> v4(v3);//拷貝構(gòu)造
string s("hello world");
vector<char> v5(s.begin(), s.end());
vector創(chuàng)建對(duì)象的過(guò)程也就是它調(diào)用其構(gòu)造函數(shù)和拷貝構(gòu)造的過(guò)程,我們也可以將s中字符串存入容器v5中。
注意vector<char>不能取代string,這是因?yàn)槭褂胿ector<char>需要手動(dòng)打印’\0’,并且vector也不支持+=和比較大小等一系列的操作。
3.遍歷vector
為了更好地演示,我們先定義一個(gè)數(shù)組,并向其中傳入數(shù)據(jù)。
vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5);
(1)下標(biāo)遍歷
下標(biāo)遍歷可讀可寫。
for (int i = 0; i < v.size(); i++)
{
v[i] += 1;//可以修改,因?yàn)榉祷氐闹凳且?
cout << v[i] << endl;
}

(2)迭代器遍歷
vector<int>::iterator it = v.begin();while (it != v.end()){*it -= 1;cout << *it << " " ;++it;}
(3)范圍for遍歷
for (auto& e: v)
{
cout << e << " ";
}

原生指針就是天然的迭代器,數(shù)組支持范圍for會(huì)被替換成指針。
3.vector容量函數(shù)
表示vector容量的函數(shù)一共有三個(gè)。
cout << v2.size() << endl; cout << v2.capacity() << endl; cout << v2.max_size() << endl;

v2.size()表示的是目前元素個(gè)數(shù)。
v2.capacity()表示的是最大容量。
v2.max_xize()表示的是系統(tǒng)可以分配的給vector<int>的最大容量(還未分配)。
如果內(nèi)存是一個(gè)圖書館的話,vector<int>表示的是一個(gè)書架,size()就表示書架上放了多少書,capacity()表示的就是書架的最大容量,max_size表示的是圖書館中最大能放一個(gè)容量為多大的書架。
4.vector的擴(kuò)容函數(shù)
我們使用vector的時(shí)候通常也是在堆上開(kāi)辟空間的。這就需要用到兩個(gè)函數(shù),reseve和resize,其使用方法和string的一樣,reserve只開(kāi)空間不初始化,resize開(kāi)空間而且還初始化,不傳初始化內(nèi)容默認(rèn)為0。
vector<int> v2(10,45);//創(chuàng)建有十個(gè)8的對(duì)象v2 cout << v2.size() << endl; cout << v2.capacity() << endl; v2.reserve(20); cout << v2.size() << endl; cout << v2.capacity() << endl;

resize需要借助調(diào)試來(lái)觀察初始化的內(nèi)容:

通過(guò)調(diào)試我們可以看到新開(kāi)辟的空間里都初始化成了0。
我們還可以通過(guò)assign函數(shù)來(lái)將之前的內(nèi)容進(jìn)行覆蓋。
vector<int> v1;//創(chuàng)建空對(duì)象v1 vector<int> v2(10,45);//創(chuàng)建有十個(gè)8的對(duì)象v2 v2.assign(20, 5);

5.vector的插入刪除
(1)尾插與尾刪
插入刪除主要使用四個(gè)函數(shù):
尾插:push_back
尾刪:pop_back
定點(diǎn)插入:insert
定點(diǎn)刪除:erase
刪除所有數(shù)據(jù):clear
vector<int> v1;//創(chuàng)建空對(duì)象v1
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
for (auto& e: v1)
{
cout << e << " ";
}

pop_back這里就不演示了,就是一個(gè)簡(jiǎn)單的尾刪。
(2)insert與erase
insert與erase是最容易引起迭代器失效的兩個(gè)函數(shù),關(guān)于迭代器失效的原理我會(huì)在下一節(jié)vector的模擬實(shí)現(xiàn)中詳細(xì)解釋。現(xiàn)在只需要記住string與vector迭代器失效的兩種情況即可:
1.如果空間被重新分配,則指向容器的迭代器、指針和引用都會(huì)失效。
2.如果空間沒(méi)被重新分配,指向插入位置之前的元素的迭代器、指針和引用依然有效,但指向插入位置之后元素的帶帶器、指針和引用將會(huì)失效。
注意,這里的迭代器指的是我們自己定義的迭代器。
vector<int>::iterator ret = v1.begin(); v1.insert(ret, 0);//在ret處插入0
我們可以通過(guò)insert來(lái)進(jìn)行插入元素。
但當(dāng)我們進(jìn)行刪除的時(shí)候,如果這樣寫程序會(huì)報(bào)錯(cuò)的。
vector<int>::iterator ret = v1.begin(); v1.insert(ret, 0); v1.erase(ret);

這是因?yàn)槲覀儗?duì)v1進(jìn)行了插入數(shù)據(jù),空間被重新分配了,原有的ret失效了。如果要?jiǎng)h除首元素,需要使用v1.begin()來(lái)刪除。

為了保險(xiǎn)起見(jiàn),使用插入或者刪除的操作之后,一定要記得更新迭代器。
(3)clear
clear會(huì)刪除所有數(shù)據(jù),注意一點(diǎn),刪除數(shù)據(jù)不會(huì)刪除容量。
vector的特殊應(yīng)用
vector<vector <int>>
表示一個(gè)二維數(shù)組,vector本身就是一個(gè)模板類型,里面也可以存放一個(gè)vector<int>的類型。
相當(dāng)于vector本身是一個(gè)數(shù)組,它的每個(gè)數(shù)據(jù)又是一個(gè)int類型的數(shù)組。

vector<string>
表示數(shù)組中每一個(gè)元素都是一個(gè)字符串。
6.總結(jié)
vector的基本函數(shù)都介紹完了,這些已經(jīng)足夠我們使用了,如果知識(shí)在精不在多,如果還希望了解更過(guò)vector的成員函數(shù)的話,可以登錄cplusplus.com來(lái)進(jìn)行搜索。
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
詳解C語(yǔ)言的隨機(jī)數(shù)生成及其相關(guān)題目
這篇文章主要介紹了詳解C語(yǔ)言的隨機(jī)數(shù)生成及其相關(guān)題目,作者還列舉了阿里巴巴的一道相關(guān)的面試題,需要的朋友可以參考下2015-08-08
一篇文章帶你用C語(yǔ)言玩轉(zhuǎn)結(jié)構(gòu)體
本文主要介紹C語(yǔ)言 結(jié)構(gòu)體的知識(shí),學(xué)習(xí)C語(yǔ)言肯定需要學(xué)習(xí)結(jié)構(gòu)體,這里詳細(xì)說(shuō)明了結(jié)構(gòu)體并附示例代碼,供大家參考學(xué)習(xí),有需要的小伙伴可以參考下2021-09-09
C語(yǔ)言 完整游戲項(xiàng)目推箱子詳細(xì)代碼
經(jīng)典的推箱子是一個(gè)的古老游戲,目的是在訓(xùn)練你的邏輯思考能力。在一個(gè)狹小的倉(cāng)庫(kù)中,要求把木箱放到指定的位置,稍不小心就會(huì)出現(xiàn)箱子無(wú)法移動(dòng)或者通道被堵住的情況,所以需要巧妙的利用有限的空間和通道,合理安排移動(dòng)的次序和位置,才能順利的完成任務(wù)2021-11-11
C++中的結(jié)構(gòu)體vector排序問(wèn)題
這篇文章主要介紹了C++中的結(jié)構(gòu)體vector排序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
基于c語(yǔ)言知識(shí)點(diǎn)的補(bǔ)遺介紹
本篇文章是對(duì)c語(yǔ)言知識(shí)點(diǎn)的一些補(bǔ)遺進(jìn)行詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語(yǔ)言演示對(duì)歸并排序算法的優(yōu)化實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言演示對(duì)歸并排序算法的優(yōu)化實(shí)現(xiàn),歸并排序的最差時(shí)間復(fù)雜度為(n\log n),最優(yōu)時(shí)間復(fù)雜為(n),存在可以改進(jìn)的空間,需要的朋友可以參考下2016-05-05

