這周作業(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