91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

30條有效使用STL的經(jīng)驗

Linux愛好者 ? 來源:Linux愛好者 ? 作者:Linux愛好者 ? 2022-06-07 11:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

以下是干貨:

1.慎重選擇STL容器類型

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

b)連續(xù)內(nèi)存,支持下標訪問,可考慮選擇vector

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

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

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

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

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

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

a)大家應(yīng)該都知道,容器中存放的都是對象的拷貝,想要拷貝正確那就實現(xiàn)拷貝構(gòu)造函數(shù)和拷貝賦值運算符

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

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

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

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

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

b)更能清晰的表達意圖

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

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

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

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

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

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

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

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

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

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

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

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

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

c)要在循環(huán)內(nèi)部做某些操作

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

ii.如果容器是一個標準關(guān)聯(lián)容器,則寫一個循環(huán)來遍歷容器中的元素,記住當把迭代器傳給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)(!!!)現(xiàn)在可以統(tǒng)一使用返回值更新迭代器方式

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

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

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

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

a)這種動態(tài)擴容的容器每次擴容都會大體經(jīng)歷4步:

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

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

iii.如果有拷貝,析構(gòu)掉舊內(nèi)存中的對象

iv.如果有拷貝,釋放舊內(nèi)存

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

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

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

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

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

a)vector().swap(a)

b)a.clear()

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

11.避免使用vector存儲bool

a)有兩點:

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

ii.它不存儲bool

b)可以用deque和bitset來替代

12.理解相等和等價的區(qū)別

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

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

13.為包含指針的關(guān)聯(lián)容器指定比較類型

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

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

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

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

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

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

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

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

16.考慮用排序的vector替代關(guān)聯(lián)容器

a)在排序的vector中存儲數(shù)據(jù)可能比在標準關(guān)聯(lián)容器中存儲同樣的數(shù)據(jù)要耗費更少的內(nèi)存。

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

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

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

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

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

18.iterator優(yōu)先于const_iterator、reverse_iterator、const_reverse_iterator

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

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

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

19.使用distance和advance將容器的const_iterator轉(zhuǎn)換成iterator

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

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

a)istreambuf_iterator性能一般優(yōu)于istream_iterator

b)istreambuf_iterator不會跳過任何字符

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

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

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

22.了解各種與排序有關(guān)的選擇

a)重點關(guān)注以下幾項:

i.partial_sort

ii.nth_element

iii.stable_sort

iv.sort

v.partition

vi.stable_partition

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

c)總結(jié):

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

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

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

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

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

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

a)erase-remove這塊應(yīng)該大家都知道

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

c)remove指針時注意釋放掉對應(yīng)的內(nèi)存,防止內(nèi)存泄漏

24.了解哪些算法使用排序的區(qū)間作為參數(shù)

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

b)如果傳遞了沒有排序的區(qū)間進去,會導(dǎo)致錯誤的結(jié)果

c)要求排序區(qū)間的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)下面的算法不一定要求排序區(qū)間,但通常和排序區(qū)間一起使用

i.unique

ii.unique_copy

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

a)mismatch或lexicographical_compare更通用

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

26.使用accumulate或者for_each進行區(qū)間統(tǒng)計

a)accumulate會計算出一個區(qū)間的統(tǒng)計信息

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

27.算法調(diào)用優(yōu)先于手寫的循環(huán)

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

b)比如:

i.min_element

ii.accumulate

iii.partition

iv.find

v.find_if

vi.for_each

vii.erase-remove

viii.transform

28.容器的成員函數(shù)優(yōu)先于同名的算法

a)關(guān)聯(lián)容器提供了count、find、lower_bound、upper_bound、equal_range

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

c)有兩個原因:

i.成員函數(shù)通常與容器(特別是關(guān)聯(lián)容器)結(jié)合得更加緊密

ii.成員函數(shù)往往速度更快

29.正確區(qū)分count、find、binary_search、lower_bound、upper_bound、equal_range

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

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

a)現(xiàn)在一般都是使用lambda表達式作為STL算法參數(shù)

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    531

    瀏覽量

    22965
  • STL
    STL
    +關(guān)注

    關(guān)注

    0

    文章

    86

    瀏覽量

    19242
  • 迭代器
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    4624

原文標題:Effective STL, 30 條有效使用 STL 的經(jīng)驗

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    深入解析REF30與REF30E低電流電壓基準源

    深入解析REF30與REF30E低電流電壓基準源 在電子設(shè)計領(lǐng)域,電壓基準源是確保系統(tǒng)穩(wěn)定運行的關(guān)鍵組件之一。今天,我們將深入探討REF30和REF30E這兩款低電流電壓基準源,它們以
    的頭像 發(fā)表于 03-02 10:15 ?127次閱讀

    RGB時序燈的工作原理講解

    圖文配合講解了RGB時序燈的應(yīng)用場景、什么是RGB時序燈、信號格式與傳輸規(guī)則、燈珠芯片的工作流程、顏色與動態(tài)效果控制方式等
    發(fā)表于 02-06 11:36 ?0次下載

    BNC連接器射頻線應(yīng)用經(jīng)驗分享

    本文結(jié)合工程實踐經(jīng)驗,分享了BNC連接器與射頻線在安裝、壓接、焊接、線材管理及防護方面的實用技巧,幫助工程師提升射頻系統(tǒng)的可靠性與信號穩(wěn)定性。
    的頭像 發(fā)表于 01-12 11:43 ?173次閱讀
    BNC連接器射頻線應(yīng)用<b class='flag-5'>經(jīng)驗</b>分享

    如何評估SDRAM的有效帶寬

    在進行電子系統(tǒng)設(shè)計時,我們經(jīng)常會用到SDRAM(SDR SDRAM或者DDRX SDRAM)作為緩沖單元,但是如何評估SDRAM的有效帶寬呢(評估有效帶寬才能夠了解當前緩沖單元以及驅(qū)動方式能否滿足我們的設(shè)計需求)?
    的頭像 發(fā)表于 01-12 09:17 ?343次閱讀
    如何評估SDRAM的<b class='flag-5'>有效</b>帶寬

    博通LED燈:設(shè)計與應(yīng)用的全面指南

    博通LED燈:設(shè)計與應(yīng)用的全面指南 作為電子工程師,我們在設(shè)計項目時經(jīng)常會用到各種LED燈。今天就來詳細聊聊博通(Broadcom)的HLCP-x100和HLMP-2xxx系列LED燈,深入
    的頭像 發(fā)表于 12-30 15:30 ?258次閱讀

    ?STL320N4LF8 N溝道功率MOSFET技術(shù)解析與應(yīng)用指南

    意法半導(dǎo)體 STL320N4LF8 N溝道STripFET F8功率MOSFET 采用STripFET F8溝槽式MOSFET技術(shù)制造而成。 該器件完全符合工業(yè)級標準。STL320N4LF8可降低
    的頭像 發(fā)表于 10-29 15:48 ?713次閱讀
    ?<b class='flag-5'>STL</b>320N4LF8 N溝道功率MOSFET技術(shù)解析與應(yīng)用指南

    STL325N4LF8AG N通道功率MOSFET技術(shù)解析與應(yīng)用指南

    意法半導(dǎo)體STL325N4LF8AG N溝道功率MOSFET采用STripFET F8技術(shù),具有增強型溝槽柵極結(jié)構(gòu)。 STL325N4LF8AG可確保非常低的導(dǎo)通電阻。該器件還降低內(nèi)部電容和柵極電荷,實現(xiàn)更快、更高效的開關(guān)。
    的頭像 發(fā)表于 10-29 15:34 ?750次閱讀
    <b class='flag-5'>STL</b>325N4LF8AG N通道功率MOSFET技術(shù)解析與應(yīng)用指南

    STL120N10F8功率MOSFET技術(shù)解析與應(yīng)用指南

    STMicroelectronics STL120N10F8100V N溝道增強模式STripFET MOSFET采用ST的STripFET F8技術(shù),具有增強型溝槽柵極結(jié)構(gòu)。它確保極低的導(dǎo)通電
    的頭像 發(fā)表于 10-25 09:55 ?1205次閱讀
    <b class='flag-5'>STL</b>120N10F8功率MOSFET技術(shù)解析與應(yīng)用指南

    兆易創(chuàng)新GD32F5xx與GD32G5xx STL軟件測試庫獲頒IEC61508功能安全認證

    授予的IEC 61508 SC3(SIL 2/SIL 3)功能安全認證。這是繼GD32H7與GD32F30x STL之后,兆易創(chuàng)新在功能安全領(lǐng)域?qū)崿F(xiàn)的又一重要拓展,已實現(xiàn)Arm? Cortex?-M7
    的頭像 發(fā)表于 10-24 12:55 ?411次閱讀

    ?REF30/REF30E 低功耗電壓參考芯片技術(shù)文檔總結(jié)

    REF30 是一款精密、低功耗、低壓差電壓基準電壓源系列,采用微型 3 引腳 SOT-23 封裝。REF30E 是 REF30 系列的增強型性能版本,專為精密應(yīng)用而設(shè)計。REF30E
    的頭像 發(fā)表于 08-10 11:12 ?1482次閱讀
    ?REF<b class='flag-5'>30</b>/REF<b class='flag-5'>30</b>E 低功耗電壓參考芯片技術(shù)文檔總結(jié)

    【HarmonyOS 5】鴻蒙中進度的使用詳解

    【HarmonyOS 5】鴻蒙中進度的使用詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財# 一、HarmonyOS中Progress進度的類型
    的頭像 發(fā)表于 07-11 18:26 ?1144次閱讀
    【HarmonyOS 5】鴻蒙中進度<b class='flag-5'>條</b>的使用詳解

    工程師避坑指南:減少PCBA返工的實用經(jīng)驗

    最終良品率造成不可逆的影響。 那么,如何有效避免高頻率返工?從實際案例出發(fā),結(jié)合行業(yè)經(jīng)驗與一站式服務(wù)模式的優(yōu)勢,也許我們能找到一些解法。 高頻返工的常見誘因 在實際項目中,頻繁返工往往不是單一原因造成的,而是多因素疊加的結(jié)果。常見原因包括: 設(shè)計階段的問
    的頭像 發(fā)表于 04-30 16:42 ?636次閱讀

    簡述電源設(shè)計經(jīng)驗技巧

    在電源設(shè)計領(lǐng)域中,經(jīng)驗的積累往往決定了產(chǎn)品的穩(wěn)定性和可靠性。若是電子新人了解到一些實用的設(shè)計技巧,電源設(shè)計將事半功倍。下面將總結(jié)大佬的14電源設(shè)計經(jīng)驗,以此提供參考和指導(dǎo)。
    的頭像 發(fā)表于 04-23 09:26 ?908次閱讀

    GaN E-HEMTs的PCB布局經(jīng)驗總結(jié)

    GaN E-HEMTs的PCB布局經(jīng)驗總結(jié)
    的頭像 發(fā)表于 03-13 15:52 ?1347次閱讀
    GaN E-HEMTs的PCB布局<b class='flag-5'>經(jīng)驗</b>總結(jié)