c++學(xué)習(xí)記錄6(GeekBand)

這周作業(yè)是和vector有關(guān)的圾另,就找了找vector相關(guān)的內(nèi)容。如下:

vector是C++標(biāo)準(zhǔn)模板庫(kù)中的部分內(nèi)容班眯,它是一個(gè)多功能的希停,能夠操作多種數(shù)據(jù)結(jié)構(gòu)和算法的模板類和函數(shù)庫(kù)。vector之所以被認(rèn)為是一個(gè)容器署隘,是因?yàn)樗軌蛳袢萜饕粯哟娣鸥鞣N類型的對(duì)象宠能,簡(jiǎn)單地說(shuō),vector是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組磁餐,能夠增加和壓縮數(shù)據(jù)违崇。為了可以使用vector阿弃,必須在你的頭文件中包含下面的代碼:#include

構(gòu)造函數(shù)。

Vectors包含著一系列連續(xù)存儲(chǔ)的元素,其行為和數(shù)組類似羞延。訪問(wèn)Vector中的任意元素或從末尾添加元素都可以在常量級(jí)時(shí)間復(fù)雜度內(nèi)完成渣淳,而查找特定值的元素所處的位置或是在Vector中插入元素則是線性時(shí)間復(fù)雜度。

函數(shù)列表如下:

Constructors構(gòu)造函數(shù)

Operators對(duì)vector進(jìn)行賦值或比較

assign()對(duì)Vector中的元素賦值

at()返回指定位置的元素

back()返回最末一個(gè)元素

begin()返回第一個(gè)元素的迭代器

capacity()返回vector所能容納的元素?cái)?shù)量(在不重新分配內(nèi)存的情況下)

clear()清空所有元素

empty()判斷Vector是否為空(返回true時(shí)為空)

end()返回最末元素的迭代器(譯注:實(shí)指向最末元素的下一個(gè)位置)

erase()刪除指定元素

front()返回第一個(gè)元素

get_allocator()返回vector的內(nèi)存分配器

insert()插入元素到Vector中

max_size()返回Vector所能容納元素的最大數(shù)量(上限)

pop_back()移除最后一個(gè)元素

push_back()在Vector最后添加一個(gè)元素

rbegin()返回Vector尾部的逆迭代器

rend()返回Vector起始的逆迭代器

reserve()設(shè)置Vector最小的元素容納數(shù)量

resize()改變Vector元素?cái)?shù)量的大小

size()返回Vector元素?cái)?shù)量的大小

swap()交換兩個(gè)Vector

////////////////////////////////////////////////////////////////////////////

函數(shù)詳細(xì)說(shuō)明

構(gòu)造函數(shù)

語(yǔ)法:

vector();

vector(size_typenum,constTYPE&val);

vector(constvector&from);

vector(input_iteratorstart,input_iteratorend);

C++Vectors可以使用以下任意一種參數(shù)方式構(gòu)造:

無(wú)參數(shù)-構(gòu)造一個(gè)空的vector,

數(shù)量(num)和值(val)-構(gòu)造一個(gè)初始放入num個(gè)值為val的元素的Vector

vector(from)-構(gòu)造一個(gè)與vectorfrom相同的vector

迭代器(start)和迭代器(end)-構(gòu)造一個(gè)初始值為[start,end)區(qū)間元素的Vector(注:半開(kāi)區(qū)間).

舉例,下面這個(gè)實(shí)例構(gòu)造了一個(gè)包含5個(gè)值為42的元素的Vector

vectorv1(5,42);

運(yùn)算符

語(yǔ)法:

v1==v2

v1!=v2

v1<=v2

v1>=v2

v1

v1>v2

v[]

C++Vectors能夠使用標(biāo)準(zhǔn)運(yùn)算符:==,!=,<=,>=,<,和>.要訪問(wèn)vector中的某特定位置的元素可以使用[]操作符.

兩個(gè)vectors被認(rèn)為是相等的,如果:

它們具有相同的容量

所有相同位置的元素相等.

vectors之間大小的比較是按照詞典規(guī)則.

assign函數(shù)

語(yǔ)法:

voidassign(input_iteratorstart,input_iteratorend);

voidassign(size_typenum,constTYPE&val);

assign()函數(shù)要么將區(qū)間[start,end)的元素賦到當(dāng)前vector,或者賦num個(gè)值為val的元素到vector中.這個(gè)函數(shù)將會(huì)清除掉為vector賦值以前的內(nèi)容.

at函數(shù)

語(yǔ)法:

TYPEat(size_typeloc);

at()函數(shù)返回當(dāng)前Vector指定位置loc的元素的引用.at()函數(shù)比[]運(yùn)算符更加安全,因?yàn)樗粫?huì)讓你去訪問(wèn)到Vector內(nèi)越界的元素.例如,考慮下面的代碼:

vectorv(5,1);

for(inti=0;i<10;i++){

cout<<"Element"<

}

這段代碼訪問(wèn)了vector末尾以后的元素,這將可能導(dǎo)致很危險(xiǎn)的結(jié)果.以下的代碼將更加安全:

vectorv(5,1);

for(inti=0;i<10;i++){

cout<<"Element"<

}

取代試圖訪問(wèn)內(nèi)存里非法值的作法,at()函數(shù)能夠辨別出訪問(wèn)是否越界并在越界的時(shí)候拋出一個(gè)異常out_of_range.

back函數(shù)

語(yǔ)法:

TYPEback();

back()函數(shù)返回當(dāng)前vector最末一個(gè)元素的引用.例如:

vectorv;

for(inti=0;i<5;i++){

v.push_back(i);

}

cout<<"Thefirstelementis"<

<<"andthelastelementis"<

這段代碼產(chǎn)生如下結(jié)果:

Thefirstelementis0andthelastelementis4

begin函數(shù)

語(yǔ)法:

iteratorbegin();

begin()函數(shù)返回一個(gè)指向當(dāng)前vector起始元素的迭代器.例如,下面這段使用了一個(gè)迭代器來(lái)顯示出vector中的所有元素:

vectorv1(5,789);

vector::iteratorit;

for(it=v1.begin();it!=v1.end();it++)

cout<<*it<

capacity函數(shù)

語(yǔ)法:

size_typecapacity();

capacity()函數(shù)返回當(dāng)前vector在重新進(jìn)行內(nèi)存分配以前所能容納的元素?cái)?shù)量.

clear函數(shù)

語(yǔ)法:

voidclear();

clear()函數(shù)刪除當(dāng)前vector中的所有元素.

empty函數(shù)

語(yǔ)法:

boolempty();

如果當(dāng)前vector沒(méi)有容納任何元素,則empty()函數(shù)返回true,否則返回false.例如,以下代碼清空一個(gè)vector,并按照逆序顯示所有的元素:

vectorv;

for(inti=0;i<5;i++){

v.push_back(i);

}

while(!v.empty()){

cout<

v.pop_back();

}

end函數(shù)

語(yǔ)法:

iteratorend();

end()函數(shù)返回一個(gè)指向當(dāng)前vector末尾元素的下一位置的迭代器.注意,如果你要訪問(wèn)末尾元素,需要先將此迭代器自減1.

erase函數(shù)

語(yǔ)法:

iteratorerase(iteratorloc);

iteratorerase(iteratorstart,iteratorend);

erase函數(shù)要么刪作指定位置loc的元素,要么刪除區(qū)間[start,end)的所有元素.返回值是指向刪除的最后一個(gè)元素的下一位置的迭代器.例如:

//創(chuàng)建一個(gè)vector,置入字母表的前十個(gè)字符

vectoralphaVector;

for(inti=0;i<10;i++)

alphaVector.push_back(i+65);

intsize=alphaVector.size();

vector::iteratorstartIterator;

vector::iteratortempIterator;

for(inti=0;i

{

tartIterator=alphaVector.begin();

alphaVector.erase(startIterator);

//Displaythevector

for(tempIterator=alphaVector.begin();tempIterator!=alphaVector.end();tempIterator++)

cout<<*tempIterator;

cout<

}

這段代碼將會(huì)顯示如下輸出:

BCDEFGHIJ

CDEFGHIJ

DEFGHIJ

EFGHIJ

FGHIJ

GHIJ

HIJ

IJ

J

front函數(shù)

語(yǔ)法:

TYPEfront();

front()函數(shù)返回當(dāng)前vector起始元素的引用

get_allocator函數(shù)

語(yǔ)法:

allocator_typeget_allocator();

get_allocator()函數(shù)返回當(dāng)前vector的內(nèi)存分配器.在STL里面一般不會(huì)調(diào)用new或者alloc來(lái)分配內(nèi)存,而且通過(guò)一個(gè)allocator對(duì)象的相關(guān)方法來(lái)分配.

示例:vectorv3(3,1,v2.get_allocator());//把V2的內(nèi)存分配器作為一個(gè)參數(shù)參與構(gòu)造V3伴箩。這樣入愧,它們兩個(gè)用一個(gè)內(nèi)存分配器了。

insert函數(shù)

語(yǔ)法:

iteratorinsert(iteratorloc,constTYPE&val);

voidinsert(iteratorloc,size_typenum,constTYPE&val);

voidinsert(iteratorloc,input_iteratorstart,input_iteratorend);

insert()函數(shù)有以下三種用法:

在指定位置loc前插入值為val的元素,返回指向這個(gè)元素的迭代器,

在指定位置loc前插入num個(gè)值為val的元素

在指定位置loc前插入?yún)^(qū)間[start,end)的所有元素.

舉例:

//創(chuàng)建一個(gè)vector,置入字母表的前十個(gè)字符

vectoralphaVector;

for(inti=0;i<10;i++)

alphaVector.push_back(i+65);

//插入四個(gè)C到vector中

vector::iteratortheIterator=alphaVector.begin();

alphaVector.insert(theIterator,4,'C');

//顯示vector的內(nèi)容

for(theIterator=alphaVector.begin();theIterator!=alphaVector.end();theIterator++)

cout<<*theIterator;

這段代碼將顯示:

CCCCABCDEFGHIJ

max_size函數(shù)

語(yǔ)法:

size_typemax_size();

max_size()函數(shù)返回當(dāng)前vector所能容納元素?cái)?shù)量的最大值(譯注:包括可重新分配內(nèi)存).

pop_back

語(yǔ)法:

voidpop_back();

pop_back()函數(shù)刪除當(dāng)前vector最末的一個(gè)元素,例如:

vectoralphaVector;

for(inti=0;i<10;i++)

alphaVector.push_back(i+65);

intsize=alphaVector.size();

vector::iteratortheIterator;

for(inti=0;i

alphaVector.pop_back();

for(theIterator=alphaVector.begin();theIterator!=alphaVector.end();theIterator++)

cout<<*theIterator;

cout<

}

這段代碼將顯示以下輸出:

ABCDEFGHI

ABCDEFGH

ABCDEFG

ABCDEF

ABCDE

ABCD

ABC

AB

A

push_back函數(shù)

語(yǔ)法:

voidpush_back(constTYPE&val);

push_back()添加值為val的元素到當(dāng)前vector末尾

rbegin函數(shù)

語(yǔ)法:

reverse_iteratorrbegin();

rbegin函數(shù)返回指向當(dāng)前vector末尾的逆迭代器.(譯注:實(shí)際指向末尾的下一位置,而其內(nèi)容為末尾元素的值,詳見(jiàn)逆代器相關(guān)內(nèi)容)

示例:

vectorv1;

for(inti=1;i<=5;i++)

{

v1.push_back(i);

}

vector::reverse_iteratorpos;

pos=v1.rbegin();

cout<<*pos<<"";

pos++;

cout<<*pos<

輸出結(jié)果為:54

rend函數(shù)

語(yǔ)法:

reverse_iteratorrend();

rend()函數(shù)返回指向當(dāng)前vector起始位置的逆迭代器.

示例:

vectorv1;

for(inti=1;i<=5;i++)

{

v1.push_back(i);

}

vector::reverse_iteratorpos;

pos=v1.rend();

pos--;

cout<<*pos<<"";

pos--;

cout<<*pos<

輸出結(jié)果為:12

reserve函數(shù)

語(yǔ)法:

voidreserve(size_typesize);

reserve()函數(shù)為當(dāng)前vector預(yù)留至少共容納size個(gè)元素的空間.(譯注:實(shí)際空間可能大于size)

resize函數(shù)

語(yǔ)法:

voidresize(size_typesize,TYPEval);

resize()函數(shù)改變當(dāng)前vector的大小為size,且對(duì)新創(chuàng)建的元素賦值val

resize與reserve的區(qū)別

reserve是容器預(yù)留空間嗤谚,但并不真正創(chuàng)建元素對(duì)象棺蛛,在創(chuàng)建對(duì)象之前,不能引用容器內(nèi)的元素巩步,因此當(dāng)加入新的元素時(shí)旁赊,需要用push_back()/insert()函數(shù)。

resize是改變?nèi)萜鞯拇笮∫我埃⑶覄?chuàng)建對(duì)象终畅,因此,調(diào)用這個(gè)函數(shù)之后竟闪,就可以引用容器內(nèi)的對(duì)象了离福,因此當(dāng)加入新的元素時(shí),用operator[]操作符炼蛤,或者用迭代器來(lái)引用元素對(duì)象术徊。再者,兩個(gè)函數(shù)的形式是有區(qū)別的鲸湃,reserve函數(shù)之后一個(gè)參數(shù),即需要預(yù)留的容器的空間子寓;resize函數(shù)可以有兩個(gè)參數(shù)暗挑,第一個(gè)參數(shù)是容器新的大小,第二個(gè)參數(shù)是要加入容器中的新元素斜友,如果這個(gè)參數(shù)被省略炸裆,那么就調(diào)用元素對(duì)象的默認(rèn)構(gòu)造函數(shù)。

初次接觸這兩個(gè)接口也許會(huì)混淆鲜屏,其實(shí)接口的命名就是對(duì)功能的絕佳描述烹看,resize就是重新分配大小,reserve就是預(yù)留一定的空間洛史。這兩個(gè)接口即存在差別惯殊,也有共同點(diǎn)。下面就它們的細(xì)節(jié)進(jìn)行分析也殖。

為實(shí)現(xiàn)resize的語(yǔ)義土思,resize接口做了兩個(gè)保證:

一是保證區(qū)間[0,new_size)范圍內(nèi)數(shù)據(jù)有效,如果下標(biāo)index在此區(qū)間內(nèi),vector[indext]是合法的己儒。

二是保證區(qū)間[0,new_size)范圍以外數(shù)據(jù)無(wú)效崎岂,如果下標(biāo)index在區(qū)間外,vector[indext]是非法的闪湾。

reserve只是保證vector的空間大小(capacity)最少達(dá)到它的參數(shù)所指定的大小n冲甘。在區(qū)間[0,n)范圍內(nèi),如果下標(biāo)是index途样,vector[index]這種訪問(wèn)有可能是合法的江醇,也有可能是非法的,視具體情況而定娘纷。

resize和reserve接口的共同點(diǎn)是它們都保證了vector的空間大小(capacity)最少達(dá)到它的參數(shù)所指定的大小嫁审。

因兩接口的源代碼相當(dāng)精簡(jiǎn),以至于可以在這里貼上它們:

voidresize(size_typenew_size){resize(new_size,T());}

voidresize(size_typenew_size,constT&x){

if(new_size

erase(oldbegin+new_size,oldend);//erase區(qū)間范圍以外的數(shù)據(jù)赖晶,確保區(qū)間以外的數(shù)據(jù)無(wú)效

else

insert(oldend,new_size-oldsize,x);//填補(bǔ)區(qū)間范圍內(nèi)空缺的數(shù)據(jù)律适,確保區(qū)間內(nèi)的數(shù)據(jù)有效

示例:

#include

#include

usingnamespacestd;

voidmain()

{

vectorv1;

for(inti=1;i<=3;i++)

{

v1.push_back(i);

}

v1.resize(5,8);//多出的兩個(gè)空間都初始化為8,

for(i=0;i

{

cout<

}

cout<

v1.reserve(7);//新元素還沒(méi)有構(gòu)造,

for(i=0;i<7;i++)

{

cout<4,此時(shí)不能用[]訪問(wèn)元素

}

cout<

cout<

cout<

}

輸出結(jié)果為:

12388

12388-842150451-842150451

5

7

size函數(shù)

語(yǔ)法:

size_typesize();

size()函數(shù)返回當(dāng)前vector所容納元素的數(shù)目

swap函數(shù)

語(yǔ)法:

voidswap(vector&from);

swap()函數(shù)交換當(dāng)前vector與vectorfrom的元素

示例:

vectorv1,v2;

for(inti=1;i<=3;i++)

{

v1.push_back(i);

v2.push_back(i);

}

v2.push_back(4);

v2.push_back(5);

v1.swap(v2);

for(intj=0;j

{

cout<

}

cout<

for(intk=0;k

{

cout<

}

cout<

輸出結(jié)果為:

12345

123

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末遏插,一起剝皮案震驚了整個(gè)濱河市捂贿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胳嘲,老刑警劉巖厂僧,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異了牛,居然都是意外死亡颜屠,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門鹰祸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甫窟,“玉大人,你說(shuō)我怎么就攤上這事蛙婴〈志” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵街图,是天一觀的道長(zhǎng)浇衬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)餐济,這世上最難降的妖魔是什么耘擂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮颤介,結(jié)果婚禮上梳星,老公的妹妹穿的比我還像新娘赞赖。我一直安慰自己,他們只是感情好冤灾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布前域。 她就那樣靜靜地躺著,像睡著了一般韵吨。 火紅的嫁衣襯著肌膚如雪匿垄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天归粉,我揣著相機(jī)與錄音椿疗,去河邊找鬼。 笑死糠悼,一個(gè)胖子當(dāng)著我的面吹牛届榄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播倔喂,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼铝条,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了席噩?” 一聲冷哼從身側(cè)響起班缰,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悼枢,沒(méi)想到半個(gè)月后埠忘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馒索,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年莹妒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绰上。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡动羽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渔期,到底是詐尸還是另有隱情,我是刑警寧澤渴邦,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布疯趟,位于F島的核電站,受9級(jí)特大地震影響谋梭,放射性物質(zhì)發(fā)生泄漏信峻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一瓮床、第九天 我趴在偏房一處隱蔽的房頂上張望盹舞。 院中可真熱鬧产镐,春花似錦、人聲如沸踢步。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)获印。三九已至述雾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兼丰,已是汗流浹背玻孟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳍征,地道東北人黍翎。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像艳丛,于是被迫代替她去往敵國(guó)和親匣掸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容