c primer中文版(第4版)(中英對(duì)照)4_第1頁(yè)
c primer中文版(第4版)(中英對(duì)照)4_第2頁(yè)
c primer中文版(第4版)(中英對(duì)照)4_第3頁(yè)
c primer中文版(第4版)(中英對(duì)照)4_第4頁(yè)
c primer中文版(第4版)(中英對(duì)照)4_第5頁(yè)
已閱讀5頁(yè),還剩207頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論