(02)C++ -vector用法總結(jié)

一、vector的基本概念

vector是同一種類型的對象的集合,每個對象都有一個對應(yīng)的整數(shù)索引值。和string對象一樣,標(biāo)準(zhǔn)庫負(fù)責(zé)管理存儲元素的相關(guān)內(nèi)存。我們把vector稱為容器,是因為它可以包含其他對象。一個容器中的所有對象都必須是同一種類型的。使用vector之前,必須包含相應(yīng)的頭文件。

#include<vector>

usingstd::vector;

vector是一個類模板(classtemplate),這個類和函數(shù)定義可用于不同的數(shù)據(jù)類型上。因此,我們可以定義保存string對象的vector,或保存int值的vector,又或是保存自定義的類類型對象(如Sales_item對象)的vector。聲明從類模板產(chǎn)生的某種類型的對象,需要提供附加信息,信息的種類取決于模板。以vector為例,必須說明vector保存何種對象的類型,通過將類型放在類模板名稱后面的尖括號中來指定類型:

vector<int>ivec;//ivecholdsobjectsoftypeint

vector<Sales_item>Sales_vec;//holdsSales_items

和其他變量定義一樣,定義vector對象要指定類型和一個變量的列表。上面的第一個定義,類型是vector<int>,該類型即是含有若干int類型對象的vector,變量名為ivec。第二個定義的變量名是Sales_vec,它所保存的元素是Sales_item類型的對象。

vector不是一種數(shù)據(jù)類型,而只是一個類模板,可用來定義任意多種數(shù)據(jù)類型。vector類型的每一種都指定了其保存元素的類型。因此,vector<int>和vector<string>都是數(shù)據(jù)類型。

二、vector的基本操作

1)vector對象的定義和初始化

vector類定義了好幾種構(gòu)造函數(shù),用來定義和初始化vector對象。如下示出幾種初始化vector對象的方式:


a、創(chuàng)建確定個數(shù)的元素

若要創(chuàng)建非空的vector對象,必須給出初始化元素的值。當(dāng)把一個vector對象復(fù)制到另一個vector對象時,新復(fù)制的vector中每一個元素都初始化為原vector中相應(yīng)元素的副本。但這兩個vector對象必須保存同一種元素類型:

vector<int>ivec1;//ivec1holdsobjectsoftypeint

vector<int>ivec2(ivec1);//ok:copyelementsofivec1intoivec2

vector<string>svec(ivec1);//error:svecholdsstrings,notints

可以用元素個數(shù)和元素值對vector對象進行初始化。構(gòu)造函數(shù)用元素個數(shù)來決定vector對象保存元素的個數(shù),元素值指定每個元素的初始值:

vector<int>ivec4(10,-1);//10elements,eachinitializedto-1

vector<string>svec(10,"hi!");//10strings,eachinitializedto"hi!"

關(guān)鍵概念:vector對象動態(tài)增長

vector對象(以及其他標(biāo)準(zhǔn)庫容器對象)的重要屬性就在于可以在運行時高效地添加元素。因為vector增長的效率高,在元素值已知的情況下,最好是動態(tài)地添加元素。

雖然可以對給定元素個數(shù)的vector對象預(yù)先分配內(nèi)存,但更有效的方法是先初始化一個空vector對象,然后再動態(tài)地增加元素。

b、值初始化

如果沒有給出元素的初始化式,那么標(biāo)準(zhǔn)庫將提供一個值初始化的(valueinitialized)元素初始化式。這個由庫生成的初始值用于初始化容器中的每個元素。而元素初始化式的值取決于存儲在vector中元素的數(shù)據(jù)類型。

如果vector保存內(nèi)置類型(如int類型)的元素,那么標(biāo)準(zhǔn)庫將用0值創(chuàng)建元素初始化值

vector<string>fvec(10);//10elements,eachinitializedto0

如果向量保存類類型(如string)的元素,標(biāo)準(zhǔn)庫將用該類型的默認(rèn)構(gòu)造函數(shù)創(chuàng)建元素初始值:

vector<string>svec(10);//10elements,eachanemptystring

c、vector的操作


(1)vector對象的size

empty和size操作類似于string類型的相關(guān)操作。成員函數(shù)size返回相應(yīng)vector類定義的size_type的值。

使用size_type類型時,必須指出該類型是在哪里定義的。vector類型總是包括vector的元素類型:

vector<int>::size_type//ok

vector::size_type//error

(2)向vector添加元素

push_back()操作接受一個元素值,并將它作為一個新的元素添加到vector對象的后面,也就是“插入(push)”到vector對象的“后面(back)”:

//read?words?from?the?standard?input?and?store?the?elements?in?a?vector

stringword;

vector<string>text;//emptyvector

while(cin>>word){

text.push_back(word);//appendwordtotext

}

該循環(huán)從標(biāo)準(zhǔn)輸入讀取一系列string對象,逐一追加到vector對象的后面。首先定義一個空的vector對象text。每循環(huán)一次就添加一個新元素到vector對象,并將從輸入讀取的word值賦予該元素。當(dāng)循環(huán)結(jié)束時,text就包含了所有讀入的元素。

(3)vector的下標(biāo)操作

vector中的對象是沒有命名的,可以按vector中對象的位置來訪問它們。通常使用下標(biāo)操作符來獲取元素。vector的下標(biāo)操作類似于string類型的下標(biāo)操作。

vector的下標(biāo)操作符接受一個值,并返回vector中該對應(yīng)位置的元素。vector元素的位置從0開始。下例使用for循環(huán)把vector中的每個元素值都重置為0:

//reset?the?elements?in?the?vector?to?zero

for(vector<int>::size_type?ix=0;ix!=ivec.size();++ix)

ivec[ix]=0;

和string類型的下標(biāo)操作符一樣,vector下標(biāo)操作的結(jié)果為左值,因此可以像循環(huán)體中所做的那樣實現(xiàn)寫入。另外,和string對象的下標(biāo)操作類似,這里用size_type類型作為vector下標(biāo)的類型。

在上例中,即使ivec為空,for循環(huán)也會正確執(zhí)行。ivec為空則調(diào)用size返回0,并且for中的測試比較ix和0。第一次循環(huán)時,由于ix本身就是0,則條件測試失敗,for循環(huán)體一次也不執(zhí)行。

關(guān)鍵概念:安全的泛型編程

C++程序員習(xí)慣于優(yōu)先選用!=而不是<來編寫循環(huán)判斷條件。

(4)下標(biāo)操作不添加元素

初學(xué)C++的程序員可能會認(rèn)為vector的下標(biāo)操作可以添加元素,其實不然:(這里說明了不能用數(shù)組操作的方法,只能通過push_back的方法)

vector<int>ivec;//emptyvector(空vector)

for(vector<int>::size_typeix=0;ix!=10;++ix)

ivec[ix]=ix;//disaster:ivec?has?no?elements

上述程序試圖在ivec中插入10個新元素,元素值依次為0到9的整數(shù)。但是,這里ivec是空的vector對象,而且下標(biāo)只能用于獲取已存在的元素。

這個循環(huán)的正確寫法應(yīng)該是:

for(vector<int>::size_typeix=0;ix!=10;++ix)

ivec.push_back(ix);//ok:adds?new?element?with?value?ix

必須是已存在的元素才能用下標(biāo)操作符進行索引。通過下標(biāo)操作進行賦值時,不會添加任何元素。

警告:僅能對確知已存在的元素進行下標(biāo)操作

對于下標(biāo)操作符([]操作符)的使用有一點非常重要,就是僅能提取確實已存在的元素,例如:

vector<int>ivec;//empty?vector(空變量)

cout<<ivec[0];//Error:?ivec?has?no?elements!(ivec 是空值)

vector<int>ivec2(10);//vector?with?10?elements (vector有十個變量)

cout<<ivec[10];//Error:ivec?has?elements?0...9(錯誤ivec有元素0-9)

試圖獲取不存在的元素必然產(chǎn)生運行時錯誤。

附:常用方法

1.push_back()???在數(shù)組的最后添加一個數(shù)據(jù)

2.pop_back()????去掉數(shù)組的最后一個數(shù)據(jù)

3.at()????????????????得到編號位置的數(shù)據(jù)

4.begin()???????????得到數(shù)組頭的指針

5.end()?????????????得到數(shù)組的最后一個單元+1的指針

6.front()????????得到數(shù)組頭的引用

7.back()????????????得到數(shù)組的最后一個單元的引用

8.max_size()?????得到vector最大可以是多大

9.capacity()???????當(dāng)前vector分配的大小

10.size()???????????當(dāng)前使用數(shù)據(jù)的大小

11.resize()??改變當(dāng)前使用數(shù)據(jù)的大小,如果它比當(dāng)前使用的大,者填充默認(rèn)值

12.reserve()??????改變當(dāng)前vecotr所分配空間的大小

13.erase()?????????刪除指針指向的數(shù)據(jù)項

14.clear()??????????清空當(dāng)前的vector

15.rbegin()????????將vector反轉(zhuǎn)后的開始指針返回(其實就是原來的end-1)

16.rend()????????將vector反轉(zhuǎn)構(gòu)的結(jié)束指針返回(其實就是原來的begin-1)

17.empty()????????判斷vector是否為空

18.swap()?????????與另一個vector交換數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容