當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]第1章 容器第1條:慎重選擇容器類型。標(biāo)準(zhǔn)STL序列容器:vector、string、deque和list。標(biāo)準(zhǔn)STL關(guān)聯(lián)容器:set、multiset、map和multimap。非標(biāo)準(zhǔn)序列容器sli

第1章 容器


第1條:慎重選擇容器類型。


標(biāo)準(zhǔn)STL序列容器:vector、string、deque和list。


標(biāo)準(zhǔn)STL關(guān)聯(lián)容器:set、multiset、map和multimap。


非標(biāo)準(zhǔn)序列容器slist和rope。slist是一個(gè)單向鏈表,rope本質(zhì)上是一“重型”string。


非標(biāo)準(zhǔn)的關(guān)聯(lián)容器hash_set、hase_multiset、hash_map和hash_multimap。


vector


vector作為標(biāo)準(zhǔn)關(guān)聯(lián)容器的替代。(見(jiàn)第23條)


幾種標(biāo)準(zhǔn)的非STL容器,包括數(shù)組、bitset、valarray、stack、queue和priority_queue。


你是否關(guān)心容器中的元素是如何排序的?如果不關(guān)心,選擇哈希容器.


容器中數(shù)據(jù)的布局是否需要和C兼容?如果需要兼容,就只能選擇vector。(見(jiàn)第16條)


元素的查找速度是否是關(guān)鍵的考慮因素?如果是,就要考慮哈希容器、排序的vector和標(biāo)準(zhǔn)關(guān)聯(lián)容器-或許這就是優(yōu)先順序。


對(duì)插入和刪除操作,你需要事務(wù)語(yǔ)義嗎?如果是,只能選擇list。因?yàn)樵跇?biāo)準(zhǔn)容器中,只有l(wèi)ist對(duì)多個(gè)元素的插入操作提供了事務(wù)語(yǔ)義。


deque是唯一的、迭代器可能會(huì)變?yōu)闊o(wú)效(插入操作僅在容器末尾發(fā)生時(shí),deque的迭代器可能會(huì)變?yōu)闊o(wú)效)而指向數(shù)據(jù)的指針和引用依然有效的標(biāo)準(zhǔn)STL容器。


第2條:不要試圖編寫?yīng)毩⒂谌萜黝愋偷拇a。


如果你想編寫對(duì)大多數(shù)的容器都適用的代碼,你只能使用它們的功能的交集。不同的容器是不同的,它們有非常明顯的優(yōu)缺點(diǎn)。它們并不是被設(shè)計(jì)用來(lái)交換使用的。


  你無(wú)法編寫?yīng)毩⒂谌萜鞯拇a,但是,它們(指客戶代碼)可能可以。


第3條:確保容器中的對(duì)象拷貝正確而高效。


copy in,copy out,是STL的工作方式,它總的設(shè)計(jì)思想是為了避免不必要的拷貝。使拷貝動(dòng)作高效并且防止剝離問(wèn)題發(fā)生的一個(gè)簡(jiǎn)單辦法是使容器包含指針而不是對(duì)象。


第4條:調(diào)用empty而不是檢查size()是否為0。


  理由很簡(jiǎn)單:empty對(duì)所有的標(biāo)準(zhǔn)容器都是常數(shù)時(shí)間操作,而對(duì)一些list的實(shí)現(xiàn),size耗費(fèi)線性時(shí)間。


第5條:區(qū)間成員函數(shù)優(yōu)先于與之對(duì)應(yīng)的單元素成員函數(shù)。


區(qū)間成員函數(shù)寫起來(lái)更容易,更能清楚地表達(dá)你的意圖,而且它們表現(xiàn)出了更高的效率。


第6條:當(dāng)心C++編譯器最煩人的分析機(jī)制。


把形參加括號(hào)是合法的,把整個(gè)形參的聲明(包括數(shù)據(jù)類型和形參名字)用括號(hào)括起來(lái)是非法的。


第7條:如果容器中包含了通過(guò)new操作創(chuàng)建的指針,切記在容器對(duì)象析構(gòu)前將指針delete掉。


STL很智能,但沒(méi)有智能到知道是否該刪除自己所包含的指針?biāo)赶虻膶?duì)象的程度。為了避免資源泄漏,你必須在容器被析構(gòu)前手工刪除其中的每個(gè)指針,或使用引用計(jì)數(shù)形式的智能指針(比如Boost的sharedprt)代替指針。


第8條:切勿創(chuàng)建包含auto_ptr的容器對(duì)象。


拷貝一個(gè)auto_ptr意味著改變它的值。例如對(duì)一個(gè)包含auto_ptr的vector調(diào)用sort排序,結(jié)果是vector的幾個(gè)元素被置為NULL而相應(yīng)的元素被刪除了。


第9條:慎重選擇刪除元素的方法。


要?jiǎng)h除容器中指定值的所有對(duì)象:


如果容器是vector、string或deque,則使用erase-remove習(xí)慣用法。


SeqContainer


c.erase(remove(c.begin(),c.end(),1963),c.end());


如果容器是list,則使用list::remove。


如果容器是一個(gè)標(biāo)準(zhǔn)關(guān)聯(lián)容器,則使用它的erase成員函數(shù)。


要?jiǎng)h除容器中滿足特定條件的所有對(duì)象:


如果容器是vector、string或deque,則使用erase-remove_if習(xí)慣用法。


如果容器是list,則使用list::remove_if。


如果容器是一個(gè)標(biāo)準(zhǔn)關(guān)聯(lián)容器,則使用remove_copy_if和swap,或者寫一個(gè)循環(huán)遍歷容器的元素,記住當(dāng)把迭代器傳給erase時(shí),要對(duì)它進(jìn)行后綴遞增。


AssocCOntainer


...


AssocContainer


remove_copy_if(c.begin(), c.end(), inserter(goodValues, goodValues.end()),badValue);


c.swap(goodValues);



for(AssocContainer


if(badValue(*i)) c.erase(i++);


else ++i;


}


要在循環(huán)內(nèi)部做某些(除了刪除對(duì)象之外的)操作:


如果容器是一個(gè)標(biāo)準(zhǔn)序列容器,則寫一個(gè)循環(huán)來(lái)遍歷容器中的元素,記住每次掉用erase時(shí),要用它的返回值更新迭代器。


如果容器是一個(gè)標(biāo)準(zhǔn)關(guān)聯(lián)容器,則寫一個(gè)循環(huán)來(lái)遍歷容器中的元素,記住每次把迭代器傳給erase時(shí),要對(duì)迭代器做后綴遞增。


第10條:了解分配子(allocator)的約定和限制。


第11條:理解自定義分配子的合理用法。


第12條:切勿對(duì)STL容器的線程安全性有不切實(shí)際的依賴。


對(duì)一個(gè)STL實(shí)現(xiàn)你最多只能期望:


多個(gè)線程讀是安全的。


多個(gè)線程對(duì)不同的容器寫入操作是安全的。


你不能期望STL庫(kù)會(huì)把你從手工同步控制中解脫出來(lái),而且你不能依賴于任何線程支持。


第2章vector和string


第13條:vector和string優(yōu)先于動(dòng)態(tài)分配的數(shù)組。


如果用new,意味著你要確保后面進(jìn)行了delete。


如果你所使用的string是以引用計(jì)數(shù)來(lái)實(shí)現(xiàn)的,而你又運(yùn)行在多線程環(huán)境中,并認(rèn)為string的引用計(jì)數(shù)實(shí)現(xiàn)會(huì)影響效率,那么你至少有三種可行的選擇,而且,沒(méi)有一種選擇是舍棄STL。首先,檢查你的庫(kù)實(shí)現(xiàn),看看是否可以禁用引用計(jì)數(shù),通常是通過(guò)改變某個(gè)預(yù)處理變量的值。其次,尋找或開(kāi)發(fā)一個(gè)不使用引用計(jì)數(shù)的string實(shí)現(xiàn)。第三,考慮使用vector


第14條:使用reserve來(lái)避免不必要的重新分配。


通常有兩種方式來(lái)使用reserve以避免不必要的重新分配。第一種方式是,若能確切知道或大致預(yù)計(jì)容器中最終會(huì)有多少個(gè)元素,則此時(shí)可使用reserve。第二種方式是,先預(yù)留足夠大的空間,然后,當(dāng)把所有的數(shù)據(jù)都加入后,再去除多余的容量。


第15條:注意string實(shí)現(xiàn)的多樣性。


如果你想有效的使用STL,那么你需要知道string實(shí)現(xiàn)的多樣性,尤其是當(dāng)你編寫的代碼必須要在不同的STL平臺(tái)上運(yùn)行而你又面臨著嚴(yán)格的性能要求的時(shí)候。


第16條:了解如何把vector和string數(shù)據(jù)傳給舊的API。


如果你有個(gè)vector v,而你需要得到一個(gè)只想v中的數(shù)據(jù)的指針,從而可把數(shù)據(jù)作為數(shù)組來(lái)對(duì)才,那么只需要使用&v[0]就可以了,也可以用&*v.begin(),但是不好理解。對(duì)于string s,隨應(yīng)的形式是s.c_str()。


如果想用來(lái)自C API的數(shù)據(jù)來(lái)初始化一個(gè)vector,那么你可以利用vector和數(shù)組的內(nèi)存布局兼容性,先把數(shù)據(jù)寫入到vector中,然后把數(shù)據(jù)拷貝到期望最終寫入的STL容器中。


第17條:使用“swap技巧”出去多余的容量。


vector


表達(dá)式vector


同樣的技巧對(duì)string也實(shí)用:


string s;


...


string(s).swap(s);


第18條:避免使用vector


作為STL容器,vector


第3章 關(guān)聯(lián)容器


第19條:理解相等(equality)和等價(jià)(equivalence)的區(qū)別。


標(biāo)準(zhǔn)關(guān)聯(lián)容器總是保持排列順序的,所以每個(gè)容器必須有一個(gè)比較函數(shù)(默認(rèn)為less)。等價(jià)的定義正是通過(guò)該比較函數(shù)而確定的。相等一定等價(jià),等價(jià)不一定相等。




本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉