一、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ù)