欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ Primer 標(biāo)準(zhǔn)庫(kù)vector示例詳解

 更新時(shí)間:2025年03月07日 09:29:23   作者:c-c-developer  
該文章主要介紹了C++標(biāo)準(zhǔn)庫(kù)中的vector類(lèi)型,包括其定義、初始化、成員函數(shù)以及常見(jiàn)操作,文章詳細(xì)解釋了如何使用vector來(lái)存儲(chǔ)和操作對(duì)象集合,并提供了代碼示例來(lái)說(shuō)明vector的使用方法,感興趣的朋友一起看看吧

3.3標(biāo)準(zhǔn)庫(kù)Vector

標(biāo)準(zhǔn)庫(kù)類(lèi)型vector表示對(duì)象的集合,其中所有對(duì)象的類(lèi)型都相同。集合中的每個(gè)對(duì)象都有一個(gè)與之對(duì)應(yīng)的索引,索引用于訪問(wèn)對(duì)象。因?yàn)関ector“容納著“其他對(duì)象,所以它也常被稱(chēng)作容器(container)。

要想使用vector,必須包含適當(dāng)?shù)念^文件。在后續(xù)的例子中,都將假定做了如下using聲明;

#include<vector>
usingstd::vector;

C++語(yǔ)言既有類(lèi)模板(classtemplate),也有函數(shù)模板,其中vector是一個(gè)類(lèi)模板。只有對(duì)C++有了相當(dāng)深入的理解才能寫(xiě)出模板,事實(shí)上,我們直到第16章才會(huì)學(xué)習(xí)如何自定義模板。幸運(yùn)的是,即使還不會(huì)創(chuàng)建模板,我們也可以先試著用用它。

模板本身不是類(lèi)或函數(shù),相反可以將模板看作為編譯器生成類(lèi)或函數(shù)編寫(xiě)的一份說(shuō)明。編譯器根據(jù)模板創(chuàng)建類(lèi)或函數(shù)的過(guò)程稱(chēng)為實(shí)例化(instantiation),當(dāng)使用模板時(shí),需要指出編譯器應(yīng)把類(lèi)或函數(shù)實(shí)例化成何種類(lèi)型。

對(duì)于類(lèi)模板來(lái)說(shuō),我們通過(guò)提供一些額外信息來(lái)指定模板到底實(shí)例化成什么樣的類(lèi),需要提供哪些信息由模板決定。提供信息的方式總是這樣:即在模板名字后面跟一對(duì)尖括號(hào),在括號(hào)內(nèi)放上信息。
以vector為例,提供的額外信息是vector內(nèi)所存放對(duì)象的類(lèi)型:

    vector<int> ivec;//ivec保存int類(lèi)型的對(duì)象
    vector<Sales_item> Sales_vec//保孫Salesitem類(lèi)型的對(duì)象
    vector<vector<string>> file;//該向量的元素是vectoz對(duì)象

在上面的例子中,編詳器根據(jù)模板vector生成了三種不同的類(lèi)型,vector、vector<Sales_item>和 vector<vector>。vector是模板而非類(lèi)型,由vector生成的類(lèi)型必須包含vector中元素的類(lèi)型,例如yector。

vector能容納絕大多數(shù)類(lèi)型的對(duì)象作為其元素,但是因?yàn)橐貌皇菍?duì)象,所以不存在包含引用的vector。除此之外,其他大多數(shù)(非引用內(nèi)置類(lèi)型和類(lèi)類(lèi)型都可以構(gòu)成vector對(duì)象,甚至組成vector的元素也可以是vector。

需要指出的是,在早期版本的C++標(biāo)準(zhǔn)中如果vector的元素還是vector(或者其他模板類(lèi)型),則其定義的形式與現(xiàn)在的C++11新標(biāo)準(zhǔn)略有不同。過(guò)去,必須在外層vector對(duì)象的右尖括號(hào)和其元素類(lèi)型之間添加一個(gè)空格,如應(yīng)該寫(xiě)成vector<vector >而非vector<vector>

WARNNING :某些編譯器可能仍需以老式的聲明語(yǔ)句來(lái)處理元素為vector的vector對(duì)象,如vector<vector > 。

定義和初始化vector對(duì)象通

和任何一種類(lèi)類(lèi)型一樣,vector模板控制著定義和初始化向量的方法。表3.4列出了定義vector對(duì)象的常用方法。

表3.4:初始化vector對(duì)象的方法

vectorv1v1是一個(gè)空vector,它潛在的元素是類(lèi)型的,執(zhí)行默認(rèn)初始化
vectorv2(v1)v2中包含有v1所有元素的副本
vectorv2 =v1等價(jià)于v2(v1),v2中包含有v1所有元素的副本
vectorv3(n,val)v3包含了n個(gè)重復(fù)的元素,每個(gè)元素的值都是val
vectorv4(n)v4包含了n個(gè)重復(fù)地執(zhí)行了值初始化的對(duì)象
vectorv5{ta,b,c…)v5包含了初始值個(gè)數(shù)的元素,每個(gè)元素被賦予相應(yīng)的初始值
vectorv5=ta,b,c…)等價(jià)于v5tarbyc…

可以默認(rèn)初始化vector對(duì)象,從而創(chuàng)建一個(gè)指定類(lèi)型的空 vector:

vector<string>syec; //默認(rèn)初始化,svec不含任何元素

看起來(lái)空vector好像沒(méi)什么用,但是很快我們就會(huì)知道程序在運(yùn)行時(shí)可以很高效地往vector對(duì)象中添加元素。事實(shí)上,最常見(jiàn)的方式就是先定義一個(gè)空vector,然后當(dāng)運(yùn)行時(shí)獲取到元素的值后再逐一添加。

當(dāng)然也可以在定義vector對(duì)象時(shí)指定元素的初始值。例如,允許把一個(gè)vector對(duì)象的元素拷貝給另外一個(gè)vector對(duì)象。此時(shí),新vector對(duì)象的元素就是原vector對(duì)象對(duì)應(yīng)元素的副本。注意兩個(gè)vector對(duì)象的類(lèi)型必須相同:

vector<int> ivec;//初始狀態(tài)為空
//在此處給ivec添加一些值
vector<int> ivec2(ivec);//把tvec的元素拷貝給ivec2
vector<int> tvec3=ivecy;//把ivec的元素拷貝給ivec3
vector<string> svec(tvec2);//錯(cuò)誤:svec的元素是string對(duì)象,不是tnt

列表初始化vector對(duì)象

C++11新標(biāo)準(zhǔn)還提供了另外一種為vector對(duì)象的元素賦初值的方法,即列表初始化。此時(shí),用花括號(hào)擔(dān)起來(lái)的0個(gè)或多個(gè)初始元素值被賦給vector對(duì)象:

vector<string> articles = {“a“,“an“,“the“};

上述vector對(duì)象包含三個(gè)元素:第一個(gè)是字符串“a“,第二個(gè)是字符串“an“,最后一個(gè)是字符串“the“。

之前已經(jīng)講過(guò),C++語(yǔ)言提供了幾種不同的初始化方式。在大多數(shù)情況下這些初始化方式可以相互等價(jià)地使用,不過(guò)也并非一直如此。目前已經(jīng)介紹過(guò)的兩種例外情況是:其一,使用拷貝初始化時(shí)(即使用=時(shí)),只能提供一個(gè)初始值;其二,如果提供的是一個(gè)類(lèi)內(nèi)初始值,則只能使用拷貝初始化或使用花括號(hào)的形式初始化。第三種特殊的要求是,如果提供的是初始元素值的列表,則只能把初始值都放在花括號(hào)里進(jìn)行列表初始化,而不能放在圓括號(hào)里:

vector<string>V1{“a“,“anm,“the“};//列表初始化
vector<string>v2(“a“,“an“,“the“);//錯(cuò)誤

創(chuàng)建指定數(shù)量的元素

還可以用vector對(duì)象容納的元素?cái)?shù)量和所有元素的統(tǒng)一初始值來(lái)初始化vector對(duì)象:

vector<int>ivec(10,-1)}//10個(gè)int類(lèi)型的元素,每個(gè)都被初始化為-1
vector<string>svec(10,“hi!“);//10個(gè)string類(lèi)型的元素,
                            //每個(gè)都被初始化為“hi1

值初始化

通常情況下,可以只提供vector對(duì)象容納的元素?cái)?shù)量而不用略去初始值。此時(shí)庫(kù)會(huì)創(chuàng)建一個(gè)值初始化的(value-initialized)元素初值,并把它賦給容器中的所有元素。這個(gè)初值由vector對(duì)象中元素的類(lèi)型決定。

如果vector對(duì)象的元素是內(nèi)置類(lèi)型,比如int,則元素初始值自動(dòng)設(shè)為0。如果元素是桅種類(lèi)類(lèi)型,比如string,則元素由類(lèi)默認(rèn)初始化:

vector<int>ivec(10);     //10個(gè)元素,每個(gè)都初始化為0
vector<string>svec(10);  //10個(gè)元素,參個(gè)都是空string對(duì)象

對(duì)這種初始化的方式有兩個(gè)特殊限制:其一,有些類(lèi)要求必須明確地提供初始值,如果vector對(duì)象中元素的類(lèi)型不支持默認(rèn)初始化,我們就必須提供初始的元素值.對(duì)這種類(lèi)型的對(duì)象來(lái)說(shuō),只提供元素的數(shù)量而不設(shè)定初始值無(wú)法完成初始化工作。

其二,如果只提供了元素的數(shù)量而沒(méi)有設(shè)定初始值,只能使用直接初始化:

vector<int>vi=10;//錯(cuò)誤:必須使用直接初始化的形式指定向量大小

這里的10是用來(lái)說(shuō)明如何初始化vector對(duì)象的,我們用它的本意是想創(chuàng)建含有10個(gè)值初始化了的元素的vector對(duì)象,而非把數(shù)字10“拷貝“到vector中。因此,此時(shí)不定使用拷貝初始化。

列表初始值還是元素?cái)?shù)量?

在某些情況下,初始化的真實(shí)含義依賴(lài)于傳遞初始值時(shí)用的是花括號(hào)還是圓括號(hào)。例如,用一個(gè)整數(shù)來(lái)初始化vector時(shí),整數(shù)的含義可能是vector對(duì)象的容量也可能是元素的值。類(lèi)似的,用兩個(gè)整數(shù)來(lái)初始化vector時(shí),這兩個(gè)整數(shù)可能一個(gè)是vector對(duì)象的容量,另一個(gè)是元素的初值,也可能它們是容量為2的vector對(duì)象中兩個(gè)元素的初值。通過(guò)使用花括號(hào)或圓括號(hào)可以區(qū)分上述這些含義:

vector<int>v1(10);//vl有10個(gè)元素,每個(gè)的值都是0
vector<int>v2{10};//v2有1個(gè)元素,該元素的值是10
vector<int>v3(10,1);//v3有10個(gè)元素,每個(gè)的值都是1
vector<int>v4{10,1};//v4有2個(gè)元素,值分別是10和1

如果用的是圓括號(hào),可以說(shuō)提供的值是用秈構(gòu)造Cconstruct)vectoz對(duì)象的。例如,v1的初始值說(shuō)明了vector對(duì)象的容量;v3的兩個(gè)初始值則分別說(shuō)明了vector對(duì)象的容量和元素的初值。

如果用的是花括號(hào),可以表述成我們想列表初始化(listinitialize)該vector對(duì)象。也就是說(shuō),初始化過(guò)程會(huì)盡可能地把花括號(hào)內(nèi)的值當(dāng)成是元素初始值的列表來(lái)處理,只有在無(wú)法執(zhí)行列表初始化時(shí)才會(huì)考慮其他初始化方式。在上例中,給v2和v4提供的初始
值都能作為元素的值,所以它們都會(huì)執(zhí)行列表初始化,vector對(duì)象v2包含一個(gè)元素而vector對(duì)象v4包含兩個(gè)元素。

另一方面,如果初始化時(shí)使用了花括號(hào)的形式但是提供的值又不能用來(lái)列表初始化,就要考慮用這樣的值來(lái)構(gòu)造vector對(duì)象了。例如,要想列表初始化一個(gè)含有string對(duì)象的vector對(duì)象,應(yīng)該提供能賦給string對(duì)象的初值。此時(shí)不難區(qū)分到底是要列表初始化vector對(duì)象的元素還是用給定的容量值來(lái)構(gòu)造vector對(duì)象:

vector<string>v5{“hi“};      //列表初始化:v5有一個(gè)元素
vector<string>v6(“hi“);      //錯(cuò)誤:不能使用字符串字面值構(gòu)建vector對(duì)象
vector<string>v7{10};        //v7有10個(gè)默認(rèn)初始化的元素
vector<string>V8{10,"hin1"}; //v8有10個(gè)值為vhi“的元素

盡管在上面的例子中除了第二條語(yǔ)句之外都用了花括號(hào),但其實(shí)只有v5是列表初始化。要想列表初始化vector對(duì)象,花括號(hào)里的值必須與元素類(lèi)型相同。顯然不能用int初始化string對(duì)象,所以v7和v8提供的值不能作為元素的初始值。確認(rèn)無(wú)法執(zhí)行列表初始化后,編譯器會(huì)嘗試用默認(rèn)值初始化vector對(duì)象。

向vector對(duì)象中添加元素

對(duì)vector對(duì)象來(lái)說(shuō),直接初始化的方式適用于三種情況:初始值已知且數(shù)量較少、初始值是另一個(gè)vector對(duì)象的副本、所有元素的初始值都一樣。然而更常見(jiàn)的情況是:創(chuàng)建一個(gè)vectozr對(duì)象時(shí)并不清楚實(shí)際所需的元素個(gè)數(shù),元素的值也經(jīng)常無(wú)法確定。還有些時(shí)候即使元素的初值已知,但如果這些值總量較大而各不相同,那么在創(chuàng)建vector對(duì)象的時(shí)候執(zhí)行初始化操作也會(huì)顯得過(guò)于煩瑣。

舉個(gè)例子,如果想創(chuàng)建一個(gè)vector對(duì)象令其包含從0到9共10個(gè)元素,使用列表初始化的方法很容易做到這一點(diǎn);但如果vector對(duì)象包含的元素是從0到99或者從0到999呢?這時(shí)通過(guò)列表初始化把所有元素都一一羅列出來(lái)就不太合適了。對(duì)于此例來(lái)說(shuō),更好的處理方法是先創(chuàng)建一個(gè)空vector,然后在運(yùn)行時(shí)再利用vector的成員函數(shù)push_back向其中添加元素。push_back負(fù)責(zé)把一個(gè)值當(dāng)vector對(duì)象的尾元素“壓到(push)“vector對(duì)象的“尾端(back)“。例如:

vector<int>v2;//空vector對(duì)象
for(int i=0;i!=100;++i)
    v2.Push_back();//依次把整數(shù)值放到v2尾端
    //循環(huán)結(jié)束后v2有100個(gè)元素,值從0到99

在上例中,盡管知道vector對(duì)象最后會(huì)包含100個(gè)元素,但在一開(kāi)始還是把它聲明成空vector,在每次迭代時(shí)才順序地把下一個(gè)整數(shù)作為v2的新元素添加給它。

同樣的,如果直到運(yùn)行時(shí)才能知道vector對(duì)象中元素的確切個(gè)數(shù),也應(yīng)該使用剛剛這種方法創(chuàng)建vector對(duì)象并為其賦值。例如,有時(shí)需要實(shí)時(shí)讀入數(shù)據(jù)然后將其賦了vector對(duì)象:

//從標(biāo)準(zhǔn)輸入中讀取單詞,將其作為vector對(duì)象的元素存傅
string word;
vector<string> text;//空vector對(duì)象
while(cin>>word) {
    text.push_back(word);//把word添加到text后面
}

和之前的例子一樣,本例也是先創(chuàng)建一個(gè)宇vector,之后依次讀入未知數(shù)量的值并保存到text中。

關(guān)鍵概念:vector對(duì)象能高效增長(zhǎng)

C++標(biāo)準(zhǔn)要求vector應(yīng)該能在運(yùn)行時(shí)高效快速地添加元素。因此既然vector對(duì)象能高效地增長(zhǎng),那么在定義vector對(duì)象的時(shí)候設(shè)定其大小也就沒(méi)什么必要了,事實(shí)上如果這么做性能可能更差。只有一種例外情況,就是所有(all)元素的值都一樣。一旦元素的值有所不同,更有效的辦法是先定義一個(gè)空的vector對(duì)象,再在運(yùn)行時(shí)閉其中添加具體值。此外,vector還提供了方法,允許我們進(jìn)一步提升動(dòng)態(tài)添加元素的性能。

開(kāi)始的時(shí)候創(chuàng)建空的vector對(duì)象,在運(yùn)行時(shí)再動(dòng)態(tài)添加元素,這一做法與C語(yǔ)言及其他大多數(shù)語(yǔ)言中內(nèi)置數(shù)組類(lèi)型的用法不同。特別是如果用慣了C或者Java,可以預(yù)計(jì)在創(chuàng)建vector對(duì)象時(shí)順便指定其容量是最好的。然而事實(shí)上,通常的情況是恰

向vector對(duì)象添加元素蘊(yùn)含的編程假定

由于能高效便捷地向vector對(duì)象中添加元素,很多編程工作被極大簡(jiǎn)化了。然而,這種簡(jiǎn)便性也伴隨著一些對(duì)編寫(xiě)程序更高的要求:其中一條就是必須要確保所寫(xiě)的循環(huán)正確無(wú)誤,特別是在循環(huán)有可能改變vector對(duì)象容量的時(shí)候。

隨著對(duì)vector的更多使用,我們還會(huì)逐漸了解到其他一些隱含的要求,其中一條是現(xiàn)在就要指出的:如果循環(huán)體內(nèi)部包含有向vector對(duì)象添加元素的語(yǔ)句,則不能使用范圍for循環(huán)。

WARNING:范圍for語(yǔ)句體內(nèi)不應(yīng)改變其所造歷序列的大小。

其他vector操作

除了push_back之外,vector還提供了幾種其他操作,大多數(shù)都和string的相關(guān)操作類(lèi)似,表3.5列出了其中比較重要的一些。

表3.5:vector支持的操作

v.empty()如果v不含有任何元素,返回真;否則返回假
Y.sSize()返回v中元素的個(gè)數(shù)
Y.Push_back(t)向v的尾端添加一個(gè)值為t的元素
v[n]返回v中第n個(gè)位置上元素的引用
v1=v2用v2中元素的拷貝替換v1中的元素
vl={a,b,c…}用列表中元素的拷貝替換vl中的元素
vl==v2vl和v2相等當(dāng)且僅當(dāng)它們的元素?cái)?shù)量相同東對(duì)應(yīng)位置的元素值都相同
<,<=,>,>=顧名思義,以字典順序進(jìn)行比較

訪問(wèn)vector對(duì)象中元素的方法和訪問(wèn)string對(duì)象中字符的方法差不多,也是通過(guò)元素在vector對(duì)象中的位置。例如,可以使用范圍for語(yǔ)句處理vector對(duì)象中的所有元素:

vector<int>V{112,3,4,5,6,718,917}
for(auto&:v)//對(duì)于中的每個(gè)元素(注意:i是一個(gè)引用)
    i*=i;//求元素值的平方
for(auto i:v)//對(duì)于中的每個(gè)元素
cout<<i<<" ";//輸出該元素
cout<<endl;

第一個(gè)循環(huán)把控制變量i定義成引用類(lèi)型,這樣就能通過(guò)i給v的元素賦值,其中i的類(lèi)型由auto關(guān)鍵字指定。這里用到了一種新的復(fù)合賦值運(yùn)算符。如我們所知,+=把左側(cè)運(yùn)算對(duì)象和右側(cè)運(yùn)算對(duì)象相加,結(jié)果存入左側(cè)運(yùn)算對(duì)象;類(lèi)似的,*=把左側(cè)運(yùn)算對(duì)象和右側(cè)運(yùn)算對(duì)象相乘,結(jié)果存入左側(cè)運(yùn)算對(duì)象。最后,第二個(gè)循環(huán)輸出所有元素。

vector的empty和size兩個(gè)成員與string的同名成功能完全一致:empty檢查vector對(duì)象是否包含元素然后返回一個(gè)布爾值;size則返回vector對(duì)象中元素的個(gè)數(shù),返回值的類(lèi)型是由vector定義的size_type類(lèi)型。

各個(gè)相等性運(yùn)算符和關(guān)系運(yùn)算符也與string的相應(yīng)運(yùn)算符功能一致。兩個(gè)vector對(duì)象相等當(dāng)且僅當(dāng)它們所含的元素個(gè)數(shù)相同,而且對(duì)應(yīng)位置的元素值也相同。關(guān)系運(yùn)算符依照字典順序進(jìn)行比較:如果兩個(gè)vector對(duì)象的容量不同,但是在相同位置上的元素值都一樣,則元素較少的vector對(duì)象小于元素較多的vector對(duì)象;若元素的值有區(qū)別,則vector對(duì)象的大小關(guān)系由第一對(duì)相異的元素值的大小關(guān)系決定。

只有當(dāng)元素的值可比較時(shí),vector對(duì)象才能被比較。一些類(lèi),如string等,確實(shí)定義了自己的相等性運(yùn)算符和關(guān)系運(yùn)算符。

計(jì)算vector內(nèi)對(duì)象的索引

使用下標(biāo)運(yùn)算符能獲取到指定的元素。和string一樣,vector對(duì)象的下標(biāo)也是從0開(kāi)始計(jì)起,下標(biāo)的類(lèi)型是相應(yīng)的size_type類(lèi)型。只要vector對(duì)象不是一個(gè)常量,就能向下標(biāo)運(yùn)算符返回的元素賦值。此外,也能通過(guò)計(jì)算得到vector內(nèi)對(duì)象的索引,然后直接獲取索引位置上的元素。

舉個(gè)例子,假設(shè)有一組成績(jī)的集合,其中成績(jī)的取值是從0到100。以10分為一個(gè)分?jǐn)?shù)段,要求統(tǒng)計(jì)各個(gè)分?jǐn)?shù)段各有多少個(gè)成績(jī)。顯然,從0到100總共有101種可能的成績(jī)?nèi)≈?這些成績(jī)分布在11個(gè)分?jǐn)?shù)段上:每10個(gè)分?jǐn)?shù)構(gòu)成一個(gè)分?jǐn)?shù)段,這樣的分?jǐn)?shù)段有10個(gè),額外還有一個(gè)分?jǐn)?shù)段表示滿(mǎn)分100分。這樣第一個(gè)分?jǐn)?shù)段將統(tǒng)計(jì)成績(jī)?cè)?到9之間的數(shù)量;第二個(gè)分?jǐn)?shù)段將統(tǒng)計(jì)成績(jī)?cè)?0到19之間的數(shù)量,以此類(lèi)推。最后一個(gè)分?jǐn)?shù)段統(tǒng)計(jì)滿(mǎn)分100分的數(shù)量。

按照上面的描述,如果輸入的成績(jī)?nèi)缦?

42 65 95 100 39 67 95 76 88 76 83 92 76 93

則輸出的結(jié)果應(yīng)該是:

0 0 0 1 1 0 2 3 2 4 1

結(jié)果顯示:成績(jī)?cè)?0分以下的沒(méi)有、30分至39分有1個(gè)、40分至49分有1個(gè)、50分全59分沒(méi)有、60分至69分有2個(gè)、70分至79分有3個(gè)、80分至89分有2個(gè)、90分至99分有4個(gè),還有1個(gè)是滿(mǎn)分。

在具體實(shí)現(xiàn)時(shí)使用一個(gè)含有11個(gè)元素的vector對(duì)象,每個(gè)元素分別用于統(tǒng)計(jì)各個(gè)分?jǐn)?shù)段上出現(xiàn)的成績(jī)個(gè)數(shù)。對(duì)于某個(gè)成績(jī)來(lái)說(shuō),將其除以10就能得到對(duì)應(yīng)的分?jǐn)?shù)段索引。注意:兩個(gè)整數(shù)相除,結(jié)果還是整數(shù),余數(shù)部分被自動(dòng)忽略掉了。例如,42/10=4、65/10-6、100/10=10等。一旦計(jì)算得到了分?jǐn)?shù)段索引,就能用它作為vector對(duì)象的下標(biāo),進(jìn)而獲取該分?jǐn)?shù)段的計(jì)數(shù)值并加1:

//以10分為一個(gè)分?jǐn)?shù)段統(tǒng)計(jì)成績(jī)的數(shù)量:0~9,10~19,..,90~99,100
vector<unsigned> scores(11,0); //11個(gè)分?jǐn)?shù)段,全都初始化為0
unsigned grade;
while(cin>>grade)《//讀取成績(jī)
    if(grzade<=100)//只處理有效的成績(jī)
        ++scores[grade/10];//將對(duì)應(yīng)分?jǐn)?shù)段的計(jì)數(shù)值加1

在上面的程序中,首先定義了一個(gè)vector對(duì)象存放各個(gè)分?jǐn)?shù)段上成績(jī)的數(shù)量。此例中,由于初始狀態(tài)下每個(gè)元素的值都相同,所以我們?yōu)関ector對(duì)象申請(qǐng)了11個(gè)元素,并把所有元素的初始值都設(shè)為0。while語(yǔ)句的條件部分負(fù)責(zé)讀入成績(jī),在循環(huán)體內(nèi)部首先檢查讀入的成績(jī)是否合法(即是否小于等于100分),如果合法,將成績(jī)對(duì)應(yīng)的分?jǐn)?shù)段的計(jì)數(shù)值加1。

執(zhí)行計(jì)數(shù)值累加的那條語(yǔ)句很好地體現(xiàn)了C++程序代碼的簡(jiǎn)潔性。表達(dá)式

++scores[grade/10];//將當(dāng)前分?jǐn)?shù)段的計(jì)數(shù)值加1

等價(jià)于

auto ind = grade/10;//得到分?jǐn)?shù)段索引
scores[tnd]=scores[ind]+1;//將計(jì)數(shù)值加1

上述語(yǔ)句的含義是:用grade除以10來(lái)計(jì)算成績(jī)所在的分?jǐn)?shù)段,然后將所得的結(jié)果作為變量scores的下標(biāo)。通過(guò)運(yùn)行下標(biāo)運(yùn)算獲取該分?jǐn)?shù)段對(duì)應(yīng)的計(jì)數(shù)值,因?yàn)樾鲁霈F(xiàn)了一個(gè)屬于該分?jǐn)?shù)段的成績(jī),所以將計(jì)數(shù)值加1。

如前所述,使用下標(biāo)的時(shí)候必須清楚地知道它是否在合理范圍之內(nèi)。在這個(gè)程序里,我們事先確認(rèn)了輸入的成績(jī)確實(shí)在0到100之間,這樣計(jì)算所得的下標(biāo)就一定在0到10之間,屬于0到scores.size()-1規(guī)定的有效范圍,一定是合法的。

不能用下標(biāo)形式添加元素

剛接觸C++語(yǔ)言的程序員也許會(huì)認(rèn)為可以通過(guò)vector對(duì)象的下標(biāo)形式來(lái)添加元素,事實(shí)并非如此。下面的代碼試圖為vector對(duì)象ivec添加10個(gè)元素:

vector<int>tvec;//空vector對(duì)象
for(decltype(ivec.size())ix = 0;ix!=10;++ix)
    ivec[ix]=ix;//嚴(yán)重錯(cuò)誤:tvec不包吳任何元素

然而,這段代碼是錯(cuò)誤的:ivec是一個(gè)空vector,根本不包含任何元素,當(dāng)然也就不能通過(guò)下標(biāo)去訪問(wèn)任何元素!如前所述,正確的方法是使用push_bacK:

for(decltype(tvec.size())ix=0;ix!=10;++ix)
    ivec.push_back(ix); //正確:添加一個(gè)新元素,該元素的值是ix

vestor兌現(xiàn)(以及string對(duì)象)的下標(biāo)運(yùn)算答可用于訪問(wèn)已存在的元素。而不能用于添加元素。

提示:只能對(duì)確知已存在的元素執(zhí)行下標(biāo)操作!

關(guān)于下標(biāo)史須明確的一點(diǎn)是;只能對(duì)確知已存在的元素執(zhí)行下標(biāo)操作。例如,

vector<int>ivec;//空vector對(duì)象
cout<<ivec[013//錯(cuò)誤:ivec不艮含任何元素
vector<int>ivec2(10j);//含有10個(gè)元素的yector財(cái)象
cout<<ivec2[10];//錯(cuò)誤:ivec2元素的合法索引是從0到9

試圖用下標(biāo)的形式去訪問(wèn)一個(gè)不存在的元素將引發(fā)錦誤,不過(guò)這種錯(cuò)誤不會(huì)被編譯器發(fā)現(xiàn),而是在運(yùn)行時(shí)產(chǎn)生一個(gè)不可預(yù)知的值。

不幸的是,這種通過(guò)下標(biāo)訪問(wèn)不存在的元素的行為非常常見(jiàn),而且會(huì)產(chǎn)生很?chē)?yán)重的后果。所謂的緩沖區(qū)溢出(buffer overflow)指的就是這類(lèi)錯(cuò)誤,這也是導(dǎo)致PC及其他
設(shè)備上應(yīng)用程序出現(xiàn)安全問(wèn)題的一個(gè)重要原因。

到此這篇關(guān)于C++ Primer 標(biāo)準(zhǔn)庫(kù)vector示例詳解的文章就介紹到這了,更多相關(guān)C++ Primer 標(biāo)準(zhǔn)庫(kù)vector內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c語(yǔ)言中return與exit的區(qū)別淺析

    c語(yǔ)言中return與exit的區(qū)別淺析

    c語(yǔ)言中return與exit的區(qū)別淺析,需要的朋友可以參考一下
    2013-03-03
  • 淺析Linux下精確控制時(shí)間的函數(shù)

    淺析Linux下精確控制時(shí)間的函數(shù)

    在測(cè)試程序接口運(yùn)行時(shí)間的時(shí)候,常用time,gettimeofday等函數(shù),但是這些函數(shù)在程序執(zhí)行的時(shí)候是耗費(fèi)時(shí)間的
    2013-07-07
  • C語(yǔ)言平衡二叉樹(shù)詳解

    C語(yǔ)言平衡二叉樹(shù)詳解

    這篇文章主要介紹了C語(yǔ)言平衡二叉樹(shù)的相關(guān)資料,需要的朋友可以參考下,小編覺(jué)得這篇文章寫(xiě)的還不錯(cuò),希望能夠給你帶來(lái)幫助
    2021-11-11
  • C++淺析內(nèi)聯(lián)函數(shù)的使用

    C++淺析內(nèi)聯(lián)函數(shù)的使用

    為了消除函數(shù)調(diào)用的時(shí)空開(kāi)銷(xiāo),C++ 提供一種提高效率的方法,即在編譯時(shí)將函數(shù)調(diào)用處用函數(shù)體替換,類(lèi)似于C語(yǔ)言中的宏展開(kāi)。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱(chēng)為內(nèi)聯(lián)函數(shù)(Inline Function),又稱(chēng)內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)
    2022-05-05
  • 詳解C++之C++11的牛逼特性

    詳解C++之C++11的牛逼特性

    這篇文章主要介紹了C++之C++11的牛逼特性,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • C++生成隨機(jī)數(shù)的實(shí)現(xiàn)代碼

    C++生成隨機(jī)數(shù)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了C++生成隨機(jī)數(shù)的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C語(yǔ)言庫(kù)函數(shù)qsort的使用詳解

    C語(yǔ)言庫(kù)函數(shù)qsort的使用詳解

    C語(yǔ)言庫(kù)函數(shù)中的qsort的是一個(gè)回調(diào)函數(shù),回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù),這篇文章主要介紹了C語(yǔ)言庫(kù)函數(shù)qsort的使用,需要的朋友可以參考下
    2022-06-06
  • C++11生成隨機(jī)數(shù)(random庫(kù))的使用

    C++11生成隨機(jī)數(shù)(random庫(kù))的使用

    隨機(jī)數(shù)在很多地方都可以用到,本文主要介紹了C++11生成隨機(jī)數(shù)(random庫(kù))的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語(yǔ)言指針超詳細(xì)講解下篇

    C語(yǔ)言指針超詳細(xì)講解下篇

    指針提供了對(duì)地址操作的一種方法,因此,使用指針可使得?C?語(yǔ)言能夠更高效地實(shí)現(xiàn)對(duì)計(jì)算機(jī)底層硬件的操作。另外,通過(guò)指針可以更便捷地操作數(shù)組。在一定意義上可以說(shuō),指針是?C?語(yǔ)言的精髓
    2022-04-04
  • C++隊(duì)列用法實(shí)例

    C++隊(duì)列用法實(shí)例

    這篇文章主要介紹了C++隊(duì)列用法,實(shí)例分析了C++實(shí)現(xiàn)隊(duì)列的入隊(duì)、出隊(duì)、讀取與判斷等相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07

最新評(píng)論