色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

30條有效使用STL的經驗

Linux愛好者 ? 來源:Linux愛好者 ? 作者:Linux愛好者 ? 2022-06-07 11:41 ? 次閱讀

最近看了一本書《Effective STL》,這本書內容比較老,但里面很多內容還是值得我們學習的。書里一共有50條有效使用STL的經驗,這里整理出了30條自認為有用的條目分享給大家,希望對大家有所幫助,想了解具體內容的的朋友可以直接去看書哈。

以下是干貨:

1.慎重選擇STL容器類型

a)確保自己了解每個容器的使用場景,特定的場景選擇合適的容器類型

b)連續內存,支持下標訪問,可考慮選擇vector

c)頻繁的在中間做插入或者刪除操作,可考慮選擇list

d)兩者都有,可考慮使用deque

2.不要試圖編寫獨立于容器類型的代碼

a)不同容器有不同的成員函數,想獨立于容器類型,只能取它們的交集

b)然而,取交集意義不大

3.確保容器中的對象拷貝正確而高效

a)大家應該都知道,容器中存放的都是對象的拷貝,想要拷貝正確那就實現拷貝構造函數和拷貝賦值運算符

b)想要更高效,可以使容器包含指針而不是對象,也可考慮智能指針

4.調用empty而不是檢查size()是否為0

a)empty對所有的標準容器都是常數時間操作,而對一些list實現,size耗費線性時間

5.區間成員函數優先于與之對應的單元素成員函數

a)寫起來更方便,代碼更少

b)更能清晰的表達意圖

c)有些情況下可能更高效

6.如果容器中包含了通過new操作創建的指針,切記在容器對象析構前將指針delete

a)其實就是為了避免資源泄漏

b)可以考慮在容器中存儲shared_ptr

7.慎重選擇刪除元素的方法

a)要刪除容器中有特定值的所有對象

i.如果容器是vector、string或deque,則使用erase-remove習慣用法

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

iii.如果容器是一個標準關聯容器,則使用它的erase成員函數

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

i.如果容器是vector、string或deque,則使用erase-remove_if習慣用法

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

iii.如果容器是一個標準關聯容器,則使用remove_copy_if和swap,或者寫一個循環來遍歷容器中的元素,記住當把迭代器傳給erase時,要對它進行后綴遞增

c)要在循環內部做某些操作

i.如果容器是一個標準序列容器,則寫一個循環來遍歷容器中的元素,記住每次調用erase時,要用它的返回值更新迭代器

ii.如果容器是一個標準關聯容器,則寫一個循環來遍歷容器中的元素,記住當把迭代器傳給erase時,要對迭代器做后綴遞增。

d)返回值更新迭代器示例

for(autoi=c.begin();i!=c.end();){
if(xxx){
i=c.erase(i);
}
else++i;
}

e)迭代器后綴遞增示例

for(autoi=c.begin();i!=c.end();){
if(xxx){
c.erase(i++);
}
else++i;
}

f)(!!!)現在可以統一使用返回值更新迭代器方式

8.切勿對STL容器的線程安全性有不切實際的依賴

a)書中原話是:當涉及STL容器和線程安全性時,你可以指望一個STL庫允許多個線程同時讀一個容器,以及多個線程對不同的容器做寫入操作。你不能指望STL庫會把你從手工同步控制中解脫出來,而且你不能依賴于任何線程支持。

b)原文磨磨唧唧的,我就可以理解為STL不支持線程安全,想要線程安全,那自己加鎖就完事兒了。

9.vector等容器考慮使用reserve來避免不必要的重新分配

a)這種動態擴容的容器每次擴容都會大體經歷4步:

i.分配一塊大小為當前容量的某個倍數的新內存。大多數實現中,vector和string的容器每次以2的倍數增長

ii.把容器的所有元素從舊的內存移動或者拷貝到新的內存中

iii.如果有拷貝,析構掉舊內存中的對象

iv.如果有拷貝,釋放舊內存

b)明確size()、capacity()、resize()、reserve()四個成員函數的具體含義

c)reserve能使重新分配的次數減少到最低限度,避免重新分配和迭代器失效帶來的開銷,兩種方式:

i.若能明確知道或預計容器最終有多少元素,可使用reverse,預留適當大小的空間

ii.先預留足夠大的空間,然后,當把所有數據都加入以后,再去除多余的空間。

10.使用swap技巧除去多余的容量

a)vector().swap(a)

b)a.clear()

c)以上兩種都是清空容器的方法,swap相對于clear一般更合適一些

11.避免使用vector存儲bool

a)有兩點:

i.它不是一個STL容器,不能取元素的地址

ii.它不存儲bool

b)可以用deque和bitset來替代

12.理解相等和等價的區別

a)相等的概念基于operator==,即a==b,則為相等

b)如果!(a < b) && !(b < a),則為等價

13.為包含指針的關聯容器指定比較類型

a)容器里面存儲的都是指針,但是由于是關聯容器,需要進行比較,但默認的比較(比較指針)一般不是我們想要的行為

b)所以需要指定比較類型,自定義比較行為

14.總是讓比較函數在等值情況下返回false

a)直接看這個文章吧【線上問題】P1級公司故障,年終獎不保,很不錯

15.切勿直接修改set或multiset中的鍵

a)如果改變了鍵,那么可能破壞該容器(順序),再使用該容器可能導致不確定的結果

b)為什么標題是切勿修改set,而不是切勿修改map中的鍵呢?

i.因為map中的鍵是const K,本來就不允許修改

16.考慮用排序的vector替代關聯容器

a)在排序的vector中存儲數據可能比在標準關聯容器中存儲同樣的數據要耗費更少的內存。

b)由于Page Fault,通過二分搜索來查找一個排序的vector可能比查找一個標準關聯容器要更快一些

c)對于排序的vector,最不利的地方在于它必須保持有序,這對vector來說,代價是很高的。所以,在查找操作幾乎從不跟插入刪除操作混在一起時,使用排序的vector才更合適。

17.當效率至關重要時,請在map::operator[]與map::insert之間謹慎做出選擇

a)當向map中添加元素時,優先選用insert而不是operator[]

b)當更新map中的值時,優先選用operator[]

18.iterator優先于const_iterator、reverse_iterator、const_reverse_iterator

a)盡量用iterator來代替const或reverse型的迭代器

b)iterator相對于其它更加實用

c)很多參數都是iterator,很少有其它

19.使用distance和advance將容器的const_iterator轉換成iterator

Containerd;
ConstIterci;
Iteri(d.begin());
advance(i,distance(i,ci));

20.對于逐個字符的輸入, 請考慮使用istreambuf_iterator

a)istreambuf_iterator性能一般優于istream_iterator

b)istreambuf_iterator不會跳過任何字符

istreaminputFile("xxx.txt");
stringstr(istreambuf_iterator(inputFile),istreambuf_iterator());

21.容器的插入, 要確保目標空間足夠大

a)靈活使用reverse和back_inserter、front_inserter和inserter返回的迭代器。

22.了解各種與排序有關的選擇

a)重點關注以下幾項:

i.partial_sort

ii.nth_element

iii.stable_sort

iv.sort

v.partition

vi.stable_partition

b)對排序算法的選擇應該更多地基于所需要完成的功能,而不是算法的性能

c)總結:

i.如果需要對vector、string、deque或者數組中的元素執行一次完全排序,那可以使用sort或者stable_sort

ii.如果有一個vector、string、deque或者數組,并且只需要對等價性最前面的n個元素進行排序,那可以使用partial_sort

iii.如果有一個vector、string、deque或者數組,并且需要找到第n個位置上的元素,或者,需要找到等價性最前面的n個元素但又不必對這n個元素進行排序,那么,nth_element正是所需要的函數

iv.如果需要將一個標準序列容器中的元素按照是否滿足某個特定的條件區分開來,那么,partition和stable_partition可能正是你所需要的

v.如果你的數組在一個list中,那么你仍然可以調用partition和stable_partition算法,可以用list::sort來替代sort和stable_sort算法。

23.如果確實需要刪除元素,則需要在remove這一類算法之后調用erase

a)erase-remove這塊應該大家都知道

b)list是個例外,list的remove就是erase

c)remove指針時注意釋放掉對應的內存,防止內存泄漏

24.了解哪些算法使用排序的區間作為參數

a)某些算法為了性能考慮,需要使用排序的區間作為參數

b)如果傳遞了沒有排序的區間進去,會導致錯誤的結果

c)要求排序區間的STL算法:

i.binary_search

ii.lower_bound

iii.upper_bound

iv.equal_range

v.set_union

vi.set_intersection

vii.set_difference

viii.set_symmetric_difference

ix.merge

x.inplace_merge

xi.includes

d)下面的算法不一定要求排序區間,但通常和排序區間一起使用

i.unique

ii.unique_copy

25.通過mismatch或lexicographical_compare實現簡單的忽略大小寫的字符串比較

a)mismatch或lexicographical_compare更通用

b)但strcmp在處理長字符串時可能更高效

26.使用accumulate或者for_each進行區間統計

a)accumulate會計算出一個區間的統計信息

b)for_each是對一個區間的每個元素做一個操作

27.算法調用優先于手寫的循環

a)大多數情況下,標準的STL肯定比我們自己手寫的好一些,包括正確性以及性能和可維護性方面

b)比如:

i.min_element

ii.accumulate

iii.partition

iv.find

v.find_if

vi.for_each

vii.erase-remove

viii.transform

28.容器的成員函數優先于同名的算法

a)關聯容器提供了count、find、lower_bound、upper_bound、equal_range

b)list提供了remove、remove_if、unique、sort、merge、reverse

c)有兩個原因:

i.成員函數通常與容器(特別是關聯容器)結合得更加緊密

ii.成員函數往往速度更快

29.正確區分count、find、binary_search、lower_bound、upper_bound、equal_range

b39963c0-e484-11ec-ba43-dac502259ad0.png

30.考慮使用函數對象而不是函數作為STL算法的參數

a)現在一般都是使用lambda表達式作為STL算法參數

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 容器
    +關注

    關注

    0

    文章

    499

    瀏覽量

    22091
  • STL
    STL
    +關注

    關注

    0

    文章

    86

    瀏覽量

    18349
  • 迭代器
    +關注

    關注

    0

    文章

    44

    瀏覽量

    4330

原文標題:Effective STL, 30 條有效使用 STL 的經驗

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    電子工程師的經驗分享

    電子工程師在實際工作中積累了豐富的經驗,這些經驗對于新手工程師和電子專業的學生具有重要的參考價值。 一、電路設計經驗 電路設計核心思想 電路設計的核心在于理解電路的基本原理和功能需求。在設計電路
    的頭像 發表于 01-14 10:14 ?74次閱讀

    兆易創新再次獲得TüV萊茵STL功能安全認證

    兆易創新GigaDevice(股票代碼 603986)今日宣布,其GD32F30x STL軟件測試庫獲得了德國萊茵TüV(以下簡稱“TüV萊茵”)頒發的IEC 61508 SC3(SIL 2/SIL
    的頭像 發表于 10-17 09:49 ?590次閱讀

    風扇驅動一體控制器的燈是直流電還是交流電

    的電壓和電流相對穩定,有助于LED燈等照明設備保持穩定的發光效果,減少閃爍和光衰現象。 效率 :直流電在傳輸過程中能量損失較小,能夠更有效地驅動LED燈等照明設備,提高能源利用效率。 安全性 :直流電相對于交流電來說,在人體
    的頭像 發表于 09-23 14:40 ?292次閱讀

    【AWTK使用經驗】如何實現序列幀動畫

    AWTK是基于C語言開發的跨平臺GUI框架?!禔WTK使用經驗》系列文章將介紹開發AWTK過程中一些常見問題與解決方案,例如:如何加載外部資源?如何設計自定義進度?這些都會在系列文章進行解答。假設
    的頭像 發表于 07-18 08:25 ?461次閱讀
    【AWTK使用<b class='flag-5'>經驗</b>】如何實現序列幀動畫

    【AWTK使用經驗】如何播放視頻或攝像頭畫面

    AWTK是基于C語言開發的跨平臺GUI框架?!禔WTK使用經驗》系列文章將介紹開發AWTK過程中一些常見問題與解決方案,例如:如何加載外部資源?如何設計自定義進度?這些都會在系列文章進行解答。假設
    的頭像 發表于 07-04 08:25 ?674次閱讀
    【AWTK使用<b class='flag-5'>經驗</b>】如何播放視頻或攝像頭畫面

    《軟件開發珠璣》+60戒律

    《軟件開發珠璣》+60戒律 感謝電子發燒友社區活動提供的讀書機會。 收到這本書后,看了劉總的簽字,終于看懂了上面的字“電子發燒友社區活動”后面一個字,實在猜不出來。 本書經驗教訓60,發現踩坑掉
    發表于 06-24 19:27

    【AWTK使用經驗】如何響應物理按鍵

    AWTK是基于C語言開發的跨平臺GUI框架?!禔WTK使用經驗》系列文章將介紹開發AWTK過程中一些常見問題與解決方案,例如:如何加載外部資源?如何設計自定義進度?這些都會在系列文章進行解答。在
    的頭像 發表于 06-06 08:25 ?834次閱讀
    【AWTK使用<b class='flag-5'>經驗</b>】如何響應物理按鍵

    名單公布!【書籍評測活動NO.33】做了50年軟件開發,總結出60經驗教訓,每一都太扎心!

    的60 經驗教訓 ,分為 6 個領域,每個領域占用 1 章的篇幅。 所有的這 60 經驗教訓都會收錄在附錄中,以便大家參考。 我并沒有想著給大家提供一份這 6 個領域大而全的
    發表于 05-17 14:36

    8輸入正NAND門SN54ALS30A SN54AS30 SN74ALS30A SN74AS30數據表

    電子發燒友網站提供《8輸入正NAND門SN54ALS30A SN54AS30 SN74ALS30A SN74AS30數據表.pdf》資料免費下載
    發表于 05-14 10:54 ?0次下載
    8輸入正NAND門SN54ALS<b class='flag-5'>30</b>A SN54AS<b class='flag-5'>30</b> SN74ALS<b class='flag-5'>30</b>A SN74AS<b class='flag-5'>30</b>數據表

    STM32使用stemwin中的listview,如何加listview寬水平和垂直的滾動?

    (hItem,1); LISTVIEW_SetFixed(hItem,2); LISTVIEW_SetFixed(hItem,3); 問題二:如何加listview寬水平和垂直的滾動,像圖3DROPDOWN一樣寬的下拉滾動 我嘗試過改變數據字體,但沒
    發表于 05-10 06:52

    【AWTK使用經驗】加載和釋放外部圖片

    AWTK是基于C語言開發的跨平臺GUI框架?!禔WTK使用經驗》系列文章將介紹開發AWTK過程中一些常見問題與解決方案,例如:如何加載外部資源?如何設計自定義進度?這些都會在系列文章進行解答。加載
    的頭像 發表于 04-26 08:25 ?497次閱讀
    【AWTK使用<b class='flag-5'>經驗</b>】加載和釋放外部圖片

    【AWTK使用經驗】如何設計立體電池進度

    AWTK是基于C語言開發的跨平臺GUI框架?!禔WTK使用經驗》系列文章將介紹開發AWTK過程中一些常見問題與解決方案,例如:如何加載外部資源?如何設計自定義進度?這些都會在系列文章進行解答
    的頭像 發表于 04-18 08:25 ?490次閱讀
    【AWTK使用<b class='flag-5'>經驗</b>】如何設計立體電池進度<b class='flag-5'>條</b>?

    麥爵士madrix麥覺仕幻彩燈燈帶智能像素燈工程安裝經驗詳解

    以工程安裝經驗為基礎,為麥爵士幻彩燈燈帶智能像素燈安裝提供合理的經驗,以便提高工程施工效率,麥爵士madrix幻彩燈燈帶智能像素燈安裝經驗
    的頭像 發表于 02-27 19:55 ?1837次閱讀
    麥爵士madrix麥覺仕幻彩燈<b class='flag-5'>條</b>燈帶智能像素燈工程安裝<b class='flag-5'>經驗</b>詳解

    服務器內存和普通內存的區別

    服務器內存和普通內存的區別? 服務器內存和普通內存是計算機中常見的兩種內存設備。它們在設計、功能和應用方面存在一些顯著的區別。 1.物理特性 普通內存
    的頭像 發表于 02-19 10:19 ?9047次閱讀

    UCB_SWAP配置信息共16,寫入一有效配置后,上一需寫1使配置無效是為什么?

    UCB_SWAP配置信息共16,寫入一有效配置后,上一需寫1使配置無效。 經過實測發現配置是從下至上檢索,取最后一
    發表于 01-24 08:31
    主站蜘蛛池模板: 97在线视频免费人妻| 99热都是精品| 草莓AV福利网站导航| 美女伸开两腿让我爽| 一个人在线观看视频| 激情女人花| 18禁止观看免费私人影院| YELLOW免费观看完整视频| 农民下乡在线观看3| 卫生间被教官做好爽HH视频| 大学生一级毛片免费看| 久久久久久电影| 在线a视频| 久久久久久人精品免费费看| 在线欧美 精品 第1页| 美女视频黄a视频全免费网站色窝| 66美女人体| 狠狠色噜噜狠狠狠狠米奇777| 小鸟酱喷水| ping色堂| 久久国产36精品色熟妇| 色婷婷欧美在线播放内射| 闺蜜扒开我尿口使劲揉| 蜜芽在线影片| chinese野外男女free| 色琪琪丁香婷婷综合久久| 国产精品无码亚洲网| 人妖操女人| 70岁妇女牲交色牲片| 欧美亚洲国产激情一区二区| 福利片福利一区二区三区| 亚洲 欧洲 国产 日产 综合| 东北疯狂xxxxbbbb中国| 台湾佬综合娱乐网| 精品极品三大极久久久久| 无码99久热只有精品视频在线| 国产婷婷一区二区在线观看| 色翁荡息又大又硬又粗又爽电影| 国产精品人妻无码免费A片导航 | 闺蜜扒开我尿口使劲揉| 亚洲综合中文|