版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C++Primer中文版(第4版)(中英對(duì)照)四
PartII:ContainersandAlgorithms
第二部分:容器和算法
We'vesaidthatC++isaboutefficientprogrammingwithabstractions.TheStandardLibraryisa
goodexample:Thelibrarydefinesanumberofcontainerclassesandafamilyofgenericalgorithms
thatletuswriteprogramsthataresuccinct,abstract,andefficient.Thelibraryworriesabout
bookkeepingdetailsinparticular,takingcareofmemorymanagementsothatourprogramscanworry
abouttheactualproblemsweneedtosolve.
C++提供了使用抽象進(jìn)行高效率編程的方式。標(biāo)準(zhǔn)庫(kù)就是一個(gè)很好的例子:標(biāo)準(zhǔn)庫(kù)定義了許多容器類以及一
系列泛型算法,使程序員可以更簡(jiǎn)潔、抽象和有效地編寫(xiě)程序。這樣可以讓標(biāo)準(zhǔn)庫(kù)操心那些繁瑣的細(xì)節(jié),特
別是內(nèi)存管理,我們的程序只需要關(guān)注要解決的實(shí)際問(wèn)題就行了。
InChapter3weintroducedthevectorcontainertype.We'11learnmoreinChapter9aboutvector
andtheothersequentialcontainertypesprovidedbythelibrary.We'11alsocovermoreoperations
providedbythestringtype.Wecanthinkofastringasaspecialkindofcontainerthatcontains
onlycharacters.Thestringtypesupportsmany,butnotall,ofthecontaineroperations.
第三章介紹了vector容器類型。我們將會(huì)在第九章進(jìn)?步探討vector和其他順序容器類型,而且還會(huì)學(xué)
習(xí)string類型提供的更多操作,這些容器類型都是由標(biāo)準(zhǔn)庫(kù)定義的。我們可將string視為僅包含字符的
特殊容器,string類型提供大量(但并不是全部)的容器操作。
Thelibraryalsodefinesseveralassociativecontainers.Elementsinanassociativecontainerare
orderedbykeyratherthansequentially.Theassociativecontainerssharemanyoperationswith
thesequentialcontainersandalsodefineoperationsthatarespecifictotheassociative
containers.TheassociativecontainersarecoveredinChapter10.
標(biāo)準(zhǔn)庫(kù)還定義了兒種關(guān)聯(lián)容器。關(guān)聯(lián)容器中的元素不是順序排列,而是按鍵(key)排序的。關(guān)聯(lián)容器共享
了許多順序容器提供的操作,止匕外,還定義了自己特殊的操作。我們將在第十章學(xué)習(xí)相關(guān)的內(nèi)容。
Chapter11introducesthegenericalgorithms.Thealgorithmstypicallyoperateonarangeof
elementsfromacontainerorothersequence.Thealgorithmslibraryoffersefficient
implementationsofvariousclassicalalgorithms,suchassearching,sorting,andothercommon
tasks.Forexample,thereisacopyalgorithm,whichcopieselementsfromonesequencetoanother;
find,whichlooksforagivenelement;andsoon.Thealgorithmsaregenericintwoways:They
theycanbeappliedtodifferentkindsofcontainers,andthosecontainersmaycontainelements
ofmosttypes.
第十?章介紹了泛型算法,這些算法通常作用于容器或序列中某一范圍的元素。算法庫(kù)提供了各種各樣經(jīng)典
算法的有效實(shí)現(xiàn),像查找、排序及其他常見(jiàn)的算法任務(wù)。例如,復(fù)制算法將一個(gè)序列中所有所元素復(fù)制到另
一個(gè)序列中;查找算法則用于尋找一個(gè)指定元素,等等。泛型算法中,所謂“泛型(generic)”指的是兩
個(gè)方面:這些算法可作用于各種不同的容器類型,而這些容器乂可以容納多種不同類型的元素。
Thelibraryisdesignedsothatthecontainertypesprovideacommoninterface:Iftwocontainers
offerasimilaroperation,thenthatoperationwi11bedefinedidenticallyforbothcontainers.
Forexample,allthecontainershaveanoperationtoreturnthenumberofelementsinthecontainer.
Allthecontainersnamethatoperationsize,andtheyalldefineatypenamedsizetypethatis
thetypeofthevaluereturnedbysize.Similarly,thealgorithmshaveaconsistentinterface.
Forexample,mostalgorithmsoperateonarangeofelementsspecifiedbyapairofiterators.
為容器類型提供通用接口是設(shè)計(jì)庫(kù)的目的。如果兩種容器提供相似的操作,則為它們定義的這個(gè)操作應(yīng)該完
全相同。例如,所有容器都有返回容器內(nèi)元素個(gè)數(shù)的操作,于是所有容器都將操作命名為size,并將size返
同值的類型都指定為size_type類型。類似地,算法具有一致的接口。例如,大部分算法都作用在由一對(duì)
迭代器指定的元素范圍上。
Becausethecontaineroperationsandalgorithmsaredefinedconsistently,learningthelibrary
becomeseasier:Onceyouunderstandhowanoperationworks,youcanapplythatsameoperationto
othercontainers.Moreimportantly,thiscommonalityofinterfaceleadstomoreflexibleprograms.
Itisoftenpossibletotakeaprogramwrittentouseoneconteiinertypeandchangeittousea
differentcontainerwithouthavingtorewritecode.Aswe’11see,thecontainersofferdifferent
performancetradeoffs,andtheabilitytochangecontainertypescanbevaluablewhenfine-tuning
theperformanceofasystem.
容器提供的操作和算法是一致定義的,這使得學(xué)習(xí)標(biāo)準(zhǔn)庫(kù)更容易:只需理解一個(gè)操作如何工作,就能將該操
作應(yīng)用于其他的容器。更重要的是,接口的?致性使程序變得更靈活。通常不需要重新編寫(xiě)代碼,就可以將
一段使用某種容器類型的程序修改為使用不同容器實(shí)現(xiàn)。正如我們所看到的,容器提供了不同的性能折衷方
案,可以改變?nèi)萜黝愋蛯?duì)優(yōu)化系統(tǒng)性能來(lái)說(shuō)頗有價(jià)值。
CONTENTS
目錄
Chapter9SequentialContainers
Chapter10AssociativeContainers
Chapter11GenericAlgorithms
Chapter9.SequentialContainers
CONTENTS
目錄
Seclion9.1DefiningaSequentialContainer307
Seelion9.2IteratorsandIteratorRanges311
SQgiiop9.3SequenceContainerOperations316
Scc[iQp9.4HowavectorGrows330
Section9.5DecidingWhichContainertoUse333
Section9.6stringsRevisited335
Section9.7ContainerAdaptors348
ChapterSummary353
DefinedTerms353
Thischaptercompletesourdiscussionofthestandard-1ibrarysequentialcontainertypes.It
expandsonthematerialfromChaplcr3,whichintroducedthemostcommonlyusedsequential
container,thevectortype.Elementsinasequentialcontainerarestoredandaccessedbyposition.
Thelibraryalsodefinesseveralassociativecontainers,whichholdelementswhoseorderdepends
onakey.Associativecontainersarecoveredinthenextchapter.
第二堂介紹了最常用的順序容器:vector類型。本章將對(duì)第三章的內(nèi)容進(jìn)行擴(kuò)充和完善,繼續(xù)討論標(biāo)準(zhǔn)庫(kù)
提供的順序容器類型。順序容器內(nèi)的元素按其位置存儲(chǔ)和訪問(wèn)。除順序容器外,標(biāo)準(zhǔn)庫(kù)還定義了兒種關(guān)聯(lián)容
器,其元素按鍵(key)排序。我們將在下一章討論它們。
Thecontainerclassesshareacommoninterface.Thisfactmakesthelibraryeasiertolearn;what
welearnaboutonetypeappliestoanother.Eachcontainertypeoffersadifferentsetoftime
andfunctionalitytradeoffs.Oftenaprogramusingonetypecanbefine-tunedbysubstituting
anothercontainerwithoutchangingourcodebeyondtheneedtochangetypedeclarations.
容器類共享公共的接口,這使標(biāo)準(zhǔn)庫(kù)更容易學(xué)習(xí),只要學(xué)會(huì)其中一種類型就能運(yùn)用另種類型。每種容器類
型提供一組不同的時(shí)間和功能折衷方案。通常不需要修改代碼,只需改變類型聲明,用一種容器類型替代另
一種容器類型,就可以優(yōu)化程序的性能。
Acontainerholdsacollectionofobjectsofaspecifiedtype.We'veusedonekindofcontainer
already:thelibraryvectortype.Itisasequentialcontainer.Itholdsacollectionofelements
ofasingletype,makingitacontainer.Thoseelementsarestoredandaccessedbyposition,making
itasequentialcontainer.Theorderofelementsinasequentialcontainerisindependentofthe
valueoftheelements.Instead,theorderisdeterminedbytheorderinwhichelementsareadded
tothecontainer.
容器容納特定類型對(duì)象的集合。我們已經(jīng)使用過(guò)種容器類型:標(biāo)準(zhǔn)庫(kù)vector類型,這是種順序容器
(sequentialcontainer)°它將單一類型元素聚集起來(lái)成為容器,然后根據(jù)位置來(lái)存儲(chǔ)和訪問(wèn)這些元素,
這就是順序容器。順序容器的元素排列次序與元素值無(wú)關(guān),而是由元素添加到容器里的次序決定。
The1ibrarydefinesthreekindsofsequentialcontainers:vector,list,anddeque(shortfor
“double-endedqueue“andpronounced"deck").Thesetypesdifferinhowelementsareaccessedand
therelativerun-timecostofaddingorremovingelements.The1ibraryalsoprovidesthreecontainer
adaptors.Effectively,anadaptoradaptsanunderlyingcontainertypebydefininganewinterface
intermsoftheoperationsprovidedbytheoriginaltype.Thesequentialcontaineradaptorsare
stack,queue,andpriorityqueue.
標(biāo)準(zhǔn)庫(kù)定義了三種順序容器類型:vector、list和deque(是雙端隊(duì)列"double-endedqueue”的簡(jiǎn)寫(xiě),
發(fā)音為“deck”)。它們的差別在于訪問(wèn)元素的方式,以及添加或刪除元素相關(guān)操作的運(yùn)行代價(jià)。標(biāo)準(zhǔn)庫(kù)還
提供了三種容器適配器(adaptors)0實(shí)際上,適配器是根據(jù)原始的容器類型所提供的操作,通過(guò)定義新的
操作接口,來(lái)適應(yīng)基礎(chǔ)的容器類型。順序容器適配器包括stack.queue和priorityqueue類型,見(jiàn)表一91。
Containersdefineonlyasmallnumberofoperations.Manyadditionaloperationsareprovidedby
thealgorithmslibrary,whichwe'11coverinChapter11.Forthoseoperationsthataredefined
bythecontainers,thelibraryimposesacommoninterface.Thecontainersvaryastowhich
operationstheyprovide,butiftwocontainersprovidethesameoperation,thentheinterface(name
andnumberofarguments)willbethesameforbothcontainertypes.Thesetofoperationsonthe
containertypesformakindofhierarchy:
容器只定義了少量操作。大多數(shù)額外操作則由算法庫(kù)提供,我們將在第十?章學(xué)習(xí)算法庫(kù)。標(biāo)準(zhǔn)庫(kù)為由容器
類型定義的操作強(qiáng)加了公共的接口。這些容器類型的差別在于它們提供哪些操作,但是如果兩個(gè)容器提供了
相同的操作,則它們的接口(函數(shù)名字和參數(shù)個(gè)數(shù))應(yīng)該相同。容器類型的操作集合形成了以下層次結(jié)構(gòu):
?Someoperationsaresupportedbyal1containertypes.
一些操作適用于所有容器類型。
?Otheroperationsarecommontoonlythesequentialoronlytheassociativecontainers.
另外一些操作則只適用于順序或關(guān)聯(lián)容器類型。
?Stillothersarecommontoonlyasubsetofeitherthesequentialorassociativecontainers.
還有一些操作只適用于順序或關(guān)聯(lián)容器類型的個(gè)子集。
Intheremainderofthischapter,welookatthesequentialcontainertypesandtheiroperations
indetail.
在本章的后續(xù)部分,我們將詳細(xì)描述順序容器類型和它們所提供的操作。
表9.L順序容器類型
Table9.1.SequentialContainerTypes
SequentialContainers
順序容器
vectorSupportsfastrandomaccess
支持快速隨機(jī)訪問(wèn)
listSupportsfastinsertion/deletion
支持快速插入/刪除
dequeDouble-endedqueue
雙端隊(duì)列
SequentialContainerAdaptors
順序容器適配器
stackLastin/Firstoutstack
后進(jìn)先出(LIFO)堆棧
queueFirstin/Firstoutqueue
先進(jìn)先出(FIFO)隊(duì)列
priorityqueuePriority-managedqueue
有優(yōu)先級(jí)管理的隊(duì)列
9.1.DefiningaSequentialContainer
9.1.順序容器的定義
Wealreadyknowafairbitabouthowtousethesequentialcontainersbasedonwhatwecovered
inSection3.3(p.90).Todefineacontainerobject,wemustincludeitsassociatedheaderfile,
whichisoneof
在第3.3節(jié)中,我們已經(jīng)了解了一些使用順序容器類型的知識(shí)。為了定義一個(gè)容器類型的對(duì)象,必須先包
含相關(guān)的頭文件,即下列頭文件之一:
#include<vector>
#include<list>
#include<deque>
Eachofthecontainersisaclasstemplate(Section3.3,p.90).Todefineaparticularkindof
container,wenamethecontainerfollowedbyanglebracketsthatenclosethetypeoftheelements
thecontainerwillhold:
所有的容器都是類模板(第3.3節(jié))o要定義某種特殊的容器,必須在容器名后加一對(duì)尖括號(hào),尖括號(hào)里
面提供容器中存放的元素的類型:
vector<string>svec;//emptyvectorthatcanholdstrings
list<int>ilist;//emptylistthatcanholdints
deque<Sales_item>items;//emptydequethatholdsSales_items
Eachcontainerdefinesadefaultconstructorthatcreatesanemptycontainerofthespeicfiedtype.
Recallthatadefaultconstructortakesnoarguments.
所有容器類型都定義了默認(rèn)構(gòu)造函數(shù),用于創(chuàng)建指定類型的空容器對(duì)象。默認(rèn)構(gòu)造函數(shù)不帶參數(shù)。
Forreasonsthatshallbecomeclearshortly,themostcommonlyusedcontainer
constructoristhedefaultconstructor.Inmostprograms,usingthedefault
constructorgivesthebestrun-timeperformanceandmakesusingthecontainer
easier.
為了使程序更清晰、簡(jiǎn)短,容器類型最常用的構(gòu)造函數(shù)是默認(rèn)構(gòu)造函數(shù)。在大多數(shù)的程
序中,使用默認(rèn)構(gòu)造函數(shù)能達(dá)到最佳運(yùn)行時(shí)性能,并且使容器更容易使用。
9.1.1.InitializingContainerElements
9.1.1.容器元素的初始化
Inadditiontodefiningadefaultconstructor,eachcontainertypealsosupportsconstructorsthat
allowustospecifyinitialelementvalues.
除了默認(rèn)構(gòu)造函數(shù),容器類型還提供其他的構(gòu)造函數(shù),使程序員可一以指定元素初值,見(jiàn)表9.2。
表9.2.容器構(gòu)造函數(shù)
Table9.2.ContainerCreateanemptycontainernamedc.Cisacontainernagsuchasvector,
ConstructorsandTistheelementtype,suchasintorstring.Validforallcontainers.
C<T>c;創(chuàng)建一個(gè)名為c的空容器。C是容器類型名,如vector,T是元素類型,如int或
string適用于所有容器。
Cc(c2);Createcasacopyofcontainerc2;candc2mustbethesamecontainertype
andholdvaluesofthesametype.Validforallcontainers.
創(chuàng)建容器c2的副本c;c和c2必須具有相同的容器類型,并存放相同類型的元
素。適用于所有容器。
Cc(b,e);Createcwithacopyoftheelementsfromtherangedenotedbyiteratorsb
ande.Validforallcontainers.
創(chuàng)建c,其元素是迭代器b和e標(biāo)示的范圍內(nèi)元素的副本。適用于所有容器。
Cc(n,t);Createcwithnelements,eachwithvaluet,whichmustbeavalueofthe
elementtypeofCoratypeconvertibletothattype.
用n個(gè)值為l的元素創(chuàng)建容器c,其中值t必須是容器類型C的元素類型的值,
或者是可轉(zhuǎn)換為該類型的值。
Sequentialcontainersonly.
只適用于順序容器
Cc(n);Createcwithnvalue-initialized(Section3.3.1,p.92)elements.
創(chuàng)建有n個(gè)值初始化(第3.3.1節(jié))(value-initialized)元素的容器c0
Sequentialcontainersonly.
只適用于順序容器
IntializingaContainerasaCopyofAnotherContainer
將一個(gè)容器初始化為另一個(gè)容器的副本
Whenweinitializeasequentialcontainerusinganyconstructorotherthanthedefaultconstructor,
wemustindicatehowmanyelementsthecontainerwillhave.Wemustalsosupplyinitialvalues
forthoseelements.Onewaytospecifyboththesizeandelement,valuesistoinitializeanew
containerasacopyofanexistingcontainerofthesametype:
當(dāng)不使用默認(rèn)構(gòu)造函數(shù),而是用其他構(gòu)造函數(shù)初始化順序容器時(shí),必須指出該容器有多少個(gè)元素,并提供這
當(dāng)元素的初值。同時(shí)指定元素個(gè)數(shù)和初值的?個(gè)方法是將新創(chuàng)建的容器初始化為?個(gè)同類型的已存在容器的
副本:
vector<int>ivec;
vector<int>ivec2(ivec);//ok:ivecisvector<int>
list<int>ilist(ivec);//error:ivecisnotlist<int>
vector<double>dvec(ivec);//error:ivecholdsintnotdouble
Whenwecopyonecontainerintoanother,thetypesmustmatchexactly:The
containertypeandelementtypemustbethesame.
將一個(gè)容器復(fù)制給另一個(gè)容器時(shí),類型必須匹配:容器類型和元素類型都必須相同。
InitializingasaCopyofaRangeofElements
初始化為一段元素的副本
Althoughwecannotcopytheelementsfromonekindofcontainertoanotherdirectly,wecando
soindirectlybypassingapairofiterators(Section3.4,p.95).Whenweuseiterators,there
isnorequirementthattheconteiinertypesbeidentical.Theelementtypesinthecontainerscan
differaslongastheyarecompatible.Itmustbepossibletoconverttheelementwecopyinto
thetypeheldbythecontainerweareconstructing.
盡管不能宜接將?種容器內(nèi)的元素復(fù)制給另?種容器,但系統(tǒng)允許通過(guò)傳遞,對(duì)迭代器(第3.4甘)間接
實(shí)現(xiàn)該實(shí)現(xiàn)該功能。使用迭代器時(shí),不要求容器類型相同。容器內(nèi)的元素類型也可以不相同,只要它們相互
兼容,能夠?qū)⒁獜?fù)制的元素轉(zhuǎn)換為所構(gòu)建的新容器的元素類型,即可實(shí)現(xiàn)復(fù)制。
Theiteratorsdenotearangeofelementsthatwewanttocopy.Theseelementsareusedtoinitialize
theelementsofthenewcontainer.Theiteratorsmarkthefirstandonepastthelastelementto
becopied.Wecanusethisformofinitializationtocopyacontainerthatwecouldnotcopydirectly.
Moreimportantly,wecanuseittocopyonlyasubsequenceoftheothercontainer:
迭代器標(biāo)記了要復(fù)制的元素范圍,這些元素用于初始化新容器的元素。迭代器標(biāo)記出要復(fù)制的第一個(gè)元素和
最后個(gè)元素。采用這種初始化形式可復(fù)制不能直接復(fù)制的容器。更重要的是,可以實(shí)現(xiàn)復(fù)制其他容器的一
個(gè)子序列:
//initializeslistwithcopyofeachelementofsvec
list<string>slist(svec.beginO,svec.end());
//findmidpointinthevector
vector<string>::iteratormid=svec.beginO+svec.size()/2;
//initializefrontwithfirsthalfofsvec:Theelementsuptobutnotincluding*mid
deque<string>front(svec.begin(),mid);
//initializebackwithsecondhalfofsvec:Theelements*midthroughendofsvec
deque<string>back(mid,svec.end());
Recallthatpointersareiterators,soitshouldnotbesurprisingthatwecaninitializeacontainer
fromapairofpointersintoabuilt-inarray:
回顧一下指針,我們知道指針就是迭代器,因此允許通過(guò)使用內(nèi)置數(shù)組中的一對(duì)指針初始化容器也就不奇怪
了:
char*words[]={"stately”,〃plump〃,〃buck〃,“mulligan"};
//calculatehowmanyelementsinwords
size_twords_size=sizeof(words)/sizeof(char*);
//useentirearraytoinitializewords2
list<string>words2(words,words+words_size);
Hereweusesizeof(Section5.8,p.167)tocalculatethesizeofthearray.Weaddthatsizeto
apointertothefirstelementtogetapointertoalocationonepasttheendofthearray.The
initializersforwords2areapointertothefirstelementinwordsandasecondpointeronepast
thelastelementinthatarray.Thesecondpointerservesasastoppingcondition;thelocation
itaddressesisnotincludedintheelementstobecopied.
這里,使用sizeof(5.8節(jié))計(jì)算數(shù)組的長(zhǎng)度。將數(shù)組長(zhǎng)度加到指向第一個(gè)元素的指針上就可以得到指向
超出數(shù)組末端的下一位置的指針。通過(guò)指向第一個(gè)元素的指針words和指向數(shù)組中最后?個(gè)元素的下?位
置的指針,實(shí)現(xiàn)了words2的初始化。其中第二個(gè)指針提供停止復(fù)制的條件,其所指向的位置上存放的元素
并沒(méi)有復(fù)制。
AllocatingandInitializingaSpecifiedNumberofElements
分配和初始化指定數(shù)目的元素
Whencreatingasequentialcontainer,wemayspecifyanexplicitsizeandan(optional)initializer
tousefortheelements.Thesizecanbeeitheraconstantornon-constantexpression.Theelement
initializermustbeavalidvaluethatcanbeusedtoinitializeanobjectoftheelementtype:
創(chuàng)建順序容器時(shí),可顯式指定容器大小和?個(gè)(可選的)元素初始化式。容器大小可以是常量或非常量表達(dá)
式,元素初始化則必須是可用于初始化其元素類型的對(duì)象的值:
constlist<int>::size_typelistsize=64;
list<string>slist(list_size,〃eh?〃);//64strings,eachiseh?
Thiscodeinitializesslisttohave64elements,eachwiththevalueeh?.
這段代碼表示slist含有64個(gè)元素,每個(gè)元素都被初始化為“eh?”字符串。
Asanalternativetospecifyingthenumberofelementsandanelementinitializer,wecanalso
specifyonlythesize:
創(chuàng)建容器時(shí),除了指定元素個(gè)數(shù),還可選擇是否提供元素初始化式。我們也可以只指定容器大?。?/p>
list<int>ilist(list_size);//64elements,eachinitializedto0
//svechasasmanyelementsasthereturnvaluefromget_word_count
externunsignedgetwordcount(conststring&fi1ename);
vector<string>svec(getwordcounl("Chimera"));
Whenwedonotsupplyanelementinitializer,thelibrarygeneratesavalue^initialized(Section
3.3.1,p.92)oneforus.Tousethisformofinitialization,theelementtypemusteitherbea
built-inorcompoundtypeorbeaclasstypethathasadefaultconstructor.Iftheelementtype
doesnothaveadefaultconstructor,thenanexplicitelementinitializermustbespecified.
不提供元素初始化式時(shí),標(biāo)準(zhǔn)庫(kù)將為該容器實(shí)現(xiàn)值初始化(3.3.l&nbps;jn。采用這種類型的初始化,元
素類型必須是內(nèi)置或復(fù)合類型,或者是提供了默認(rèn)構(gòu)造函數(shù)的類類型。如果元素類型沒(méi)有默認(rèn)構(gòu)造函數(shù),則
必須顯式指定其元素初始化式。
Theconstructorsthattakeasizearevalidonlyforsequentialcontainers;they
arenotsupportedfortheassociativecontainers,
接受容器大小做形參的構(gòu)造函數(shù)只適用于順序容器,而關(guān)聯(lián)容器不支持這種初始化。
ExercisesSection9.1.1
ExerciseExplainthefollowinginitializations.Indicateifanyareinerror,and
9.1:ifso,why,
解釋下列初始化,指出哪些是錯(cuò)誤的,為什么?
intia[7]={0,1,172,3,5,8};
stringsa[6]={
“ForiSumter","Manassas","Perryville”,
“Vicksburg","Meridian","Chancellorsvilie*};
(a)vector<string>svec(sa,sa+6);
(b)list<int>ilist(ia+4,ia+6);
(c)vector<int>ivec(ia,ia+8);
(d)list<string>siist(sa+6,sa);
ExerciseShowanexampleofeachofthefourwaystocreateandinitializeavector.
9.2:Explainwhatvalueseachvectorcontains.
創(chuàng)建和初始化一個(gè)vector對(duì)象有4種方式,為每種方式提供一個(gè)例子,并解
釋每個(gè)例子生成的vector對(duì)象包含什么值。
ExerciseExplainthedifferencesbetweentheconstructorthattakesacontainer
9.3:tocopyandtheconstructorthattakestwoiterators.
解釋夏制容器對(duì)象的構(gòu)造函數(shù)和使用兩個(gè)迭代器的構(gòu)造函數(shù)之間的差別。
9.1.2.ConstraintsonTypesthataContainerCanHold
9.1.2.容器內(nèi)元素的類型約束
Whilemosttypescanbeusedastheelementtypeofacontainer,therearetwoconstraintsthat
elementtypesmustmeet:
C++語(yǔ)言中,大多數(shù)類型都可用作容器的元素類型。容器元素類型必須滿足以下兩個(gè)約束:
?Theelementtypemustsupportassignment.
元素類型必須支持賦值運(yùn)算。
?Wemustbeabletocopyobjectsoftheelementtype.
元素類型的對(duì)象必須可以復(fù)制。
Thereareadditionalconstraintsonthetypesusedasthekeyinanassociativecontainer,which
we'11coverinChapter10.
此外,關(guān)聯(lián)容器的鍵類型還需滿足其他的約束,我們將在第十章介紹相關(guān)內(nèi)容。
Mosttypesmeettheseminimalelementtyperequirements.Allofthebuilt-inorcompoundtypes,
withtheexceptionofreferences,canbeusedastheelementtype.Referencesdonotsupport
assignmentinitsordinarymeaning,sowecannothavecontainersofreferences.
大多數(shù)類型滿足上述最低限度的元素類型要求。除了引用類型外,所有內(nèi)置或復(fù)合類型都可用做元素類型。
引用不支持一般意義的賦值運(yùn)算,因此沒(méi)有元素是引用類型的容器。
Withtheexceptionofthe10librarytypes(andtheautoptrtype,whichwecoverinSection17.1.9
(p.702)),allthelibrarytypesarevalidcontainerelementtypes.Inparticular,containers
themselvessatisfytheserequirements.Wecandefinecontainerswithelementsthatarethemselves
containers.OurSales_itemtypealsosatisifestheserequirements.
除輸入輸出(10)標(biāo)準(zhǔn)庫(kù)類型(以及第17.1.9節(jié)介紹的auto_ptr類型)之外,所有其他標(biāo)準(zhǔn)庫(kù)類型都是
有效的容器元素類型。特別地,容器本身也滿足上述要求,因應(yīng),可以定義元素本身就是容器類型的容器。
Sales_item類型也滿足上述要求。
The10librarytypesdonotsupportcopyorassignment.Therefore,wecannothaveacontainerthat
holdsobjectsofthe10types.
10庫(kù)類型不支持復(fù)制或賦值。因此,不能創(chuàng)建存放10類型對(duì)象的容器。
ContainerOperationsMayImposeAdditionalRequirements
容器操作的特殊要求
Therequirementtosupportcopyandassignmentistheminimalrequirementonelementtypes.In
addition,somecontaineroperationsimposeadditionalrequirementsontheelementtype.Ifthe
elementtypedoesn'tsupporttheadditionalrequirement,thenwecannotperformthatoperation:
Wecandefineacontainerofthattypebutmaynotusethatparticularoperation.
支持復(fù)制和賦值功能是容器元素類型的最低要求。此外,一些容器操作對(duì)元素類型還有特殊要求。如果元素
類型不支持這些特殊要求,則相關(guān)的容器操作就不能執(zhí)行:我們可以定義該類型的容器,但不能使用某些特
定的操作。
Oneexampleofanoperationthatimposesatypeconstraintistheconstructorsthattakeasingle
initializerthatspecifiesthesizeofthecontainer.Ifourcontainerholdsobjectsofaclass
type,thenwecanusethisconstructoronlyiftheelementtypehasadefaultconstructor.Most
typesdohaveadefaultconstructor,althoughtherearesomeclassesthatdonot.Asanexample,
assumethatFooisaclassthatdoesnotdefineadefaultconstructorbutthatdoeshaveaconstructor
thattakesanintargument.Now,considerthefollowingdeclarations:
其中?種需外加類型要求的容器操作是指定容器大小并提供單個(gè)初始化式的構(gòu)造函數(shù)。如果容器存儲(chǔ)類類型
的對(duì)象,那么只有當(dāng)其元素類型提供默認(rèn)構(gòu)造函數(shù)時(shí),容器才能使用這種構(gòu)造函數(shù)。盡管有一些類沒(méi)有提供
默認(rèn)構(gòu)造函數(shù),但大多數(shù)類類型都會(huì)有。例如,假設(shè)類Foo沒(méi)有默認(rèn)構(gòu)造函數(shù),但提供了需要?個(gè)int型
形參的構(gòu)造函數(shù)?,F(xiàn)在,考慮下面的聲明:
vector<Foo>empty;//ok:noneedforelementdefaultconstructor
vector<Foo>bad(10);//error:nodefaultconstructorforFoo
vector<Foo>ok(10,1);//ok:eachelementinitializedto1
WecandefineanemptycontainertoholdFooobjects,butwecandefineoneofagivensizeonly
ifwealsospecifyaninitializerforeachelement.
我們定義一個(gè)存放Foo類型對(duì)象的空容器,但是,只有在同時(shí)指定每個(gè)元素的初始化式時(shí),才能使用給定
容器大小的構(gòu)造函數(shù)來(lái)創(chuàng)建同類型的容器對(duì)象。
Aswedescribethecontaineroperations,we'11notetheconstraints,ifany,thateachcontainer
operationplacesontheelementtype.
在描述容器操作時(shí),我們應(yīng)該留意(如果有的話)每個(gè)操作對(duì)元素類型的約束。
ContainersofContainers
容器的容器
Becausethecontainersmeettheconstraintsonelementtypes,wecandefineacontainerwhose
elementtypeisitselfacontainertype.Forexample,wemightdefinelinesasavectorwhose
elementsareavectorofstrings:
因?yàn)槿萜魇苋萜髟仡愋偷募s束,所以可定義元素是容器類型的容器。例如,可以定義vector類型的容器
lines,其元素為string類型的vector對(duì)象:
//notespacing:use〃〉>〃not〃>〉〃whenspecifyingacontainerelementtype
vector<vector<string>>lines;//vectorofvectors
Notethespacingusedwhenspecifyingacontainerelementtypeasacontainer:
注意,在指定容器元素為容器類型時(shí),必須如下使用空格:
vector<vector<string>>lines;//ok:spacerequiredbetweenclose>
vector<vector<string>>lines;//error:>>treatedasshiftoperator
Wemustseparatethetwoclosing>symbolswithaspacetoindicatethatthese
twocharactersrepresenttwosymbols.Withoutthespace,>>istreatedasasingle
symbol,therightshiftoperator,andresultsinacompile-timeerror.必須用
空格隔開(kāi)兩個(gè)相鄰的>符號(hào),以示這是兩個(gè)分開(kāi)的符號(hào),否則,系統(tǒng)會(huì)認(rèn)為?是單
個(gè)符號(hào),為右移操作符,并導(dǎo)致編譯時(shí)錯(cuò)誤。
ExercisesSection9.1.2
ExerciseDefinealistthatholdselementsthataredequesthatholdints.
9.4:
定義一個(gè)list對(duì)象來(lái)存儲(chǔ)deque對(duì)象里的元素,該deque對(duì)象存放int型
兀素。
ExerciseWhycanwenothavecontainersthatholdiostreatnobjects?
9.5:
為什么我們不可以使用容器來(lái)存儲(chǔ)iostream對(duì)象?
ExerciseGivenaclasstypenamedFoothatdoesnotdefineadefaultconstructor
9.6:butdoesdefineaconstructorthattakesintvalues,definealistofFoo
thatholds10elements.
假設(shè)有個(gè)名為Foo的類,這個(gè)類沒(méi)有定義默認(rèn)構(gòu)造函數(shù),但提供了需要個(gè)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 粟丘疹的臨床護(hù)理
- 帶狀皰疹后神經(jīng)痛的臨床護(hù)理
- 《保利房產(chǎn)》課件
- 加減應(yīng)用題課件
- 績(jī)效激勵(lì)措施計(jì)劃
- 制定適合企業(yè)發(fā)展的招聘計(jì)劃
- 讓社團(tuán)活動(dòng)更具吸引力的策略計(jì)劃
- 班級(jí)成果展示會(huì)的組織與策劃計(jì)劃
- 賽車贊助合同三篇
- 噴氣織機(jī)相關(guān)行業(yè)投資方案
- 幼兒園大班認(rèn)識(shí)人民幣課件
- 公路工程竣工文件資料立卷歸檔整理細(xì)則
- 漢譯巴利三藏相應(yīng)部3-蘊(yùn)篇
- 高中地理-地形對(duì)聚落及交通線路分布的影響2課件-湘教版必修1
- 變電站電氣設(shè)備簡(jiǎn)介
- OBE理念與人才培養(yǎng)方案制定ppt課件
- 綠色水彩小清新工作匯報(bào)ppt模板
- 案例上課代碼fs210-manual
- PLC自動(dòng)門課程設(shè)計(jì)
- HP1003磨煤機(jī)技術(shù)介紹[1]
- GB_T 37515-2019 再生資源回收體系建設(shè)規(guī)范(高清版)
評(píng)論
0/150
提交評(píng)論