當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(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是一個單向鏈表,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)容器的替代。(見第23條)


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


要刪除容器中指定值的所有對象:


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


SeqContainer


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


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


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


要刪除容器中滿足特定條件的所有對象:


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


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


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


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)部做某些(除了刪除對象之外的)操作:


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


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


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


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


第12條:切勿對STL容器的線程安全性有不切實際的依賴。


對一個STL實現(xiàn)你最多只能期望:


多個線程讀是安全的。


多個線程對不同的容器寫入操作是安全的。


你不能期望STL庫會把你從手工同步控制中解脫出來,而且你不能依賴于任何線程支持。


第2章vector和string


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


如果用new,意味著你要確保后面進行了delete。


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


第14條:使用reserve來避免不必要的重新分配。


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


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


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


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


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


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


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


vector


表達式vector


同樣的技巧對string也實用:


string s;


...


string(s).swap(s);


第18條:避免使用vector


作為STL容器,vector


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


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


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




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

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

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

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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