高效使用STL僅僅是個選擇的問題,都是STL,,可能寫出來的效率相差幾倍; 當(dāng)對象很大時,,建立指針的容器而不是對象的容器1)STL基于拷貝的方式的來工作,,任何需要放入STL中的元素,,都會被復(fù)制,;
注意事項: 用empty() 代替size()來檢查是否為空因為對于list,,size()會遍歷每一個元素來確定大小,,時間復(fù)雜度 o(n),線性時間,;而empty總是保證常數(shù)時間,; 盡量用區(qū)間成員函數(shù)代替單元素操作使用區(qū)間成員函數(shù)有以下好處: 1)更少的函數(shù)調(diào)用 例:將v2后半部的元素賦值給v1: 單元式操作:
使用區(qū)間成員函數(shù)assign():
使用reserver避免不必要的內(nèi)存分配(for vector)新增元素空間不夠時,vector會進行如下操作: 如果預(yù)先知道空間的大小,,預(yù)先分配了空間避免了重新分配空間和復(fù)制的代價; 注:reserve()只是修改了容量,,并非大小,,向vector中增加元素還是需要通過push_back加入; 使用有序的vector代替關(guān)聯(lián)容器(階段性的操作適用)對階段性操作的定義: 先做一系列插入,、完成之后,,后續(xù)操作都是查詢; 在階段性的操作下,,使用vector有以下優(yōu)勢: 1)因為vector有序,,關(guān)聯(lián)容器帶來的有序優(yōu)勢散失,; 在map的insert()和operator[]中仔細選擇插入時,,insert效率高;因為operator會先探查是否存在這個元素,,如果不存在就構(gòu)造一個臨時的,,然后才涉及到賦值,多了一個臨時對象的構(gòu)造,; 更新時,,[]效率更高,insert會創(chuàng)造一個對象,,然后覆蓋一個原有對象,;而[]是在原有的對象上直接賦值操作; 散列函數(shù)的默認比較函數(shù)是equal_to,,因為不需要保持有序,; 盡量用算法替代手寫的循環(huán)1)效率相比手寫更高; STL的代碼都是C++專家寫出來的,,專家寫出來的代碼在效率上很難超越,; 盡量用成員函數(shù)代替同名的算法1)基于效率考慮,成員函數(shù)知道自己這個容器和其他容器有哪些特有屬性,,能夠利用到這些特性,;而通用算法不可以; 2)對于關(guān)聯(lián)容器,,成員函數(shù)find基于等價搜索,;而通用算法find基于相等來搜索,;可能導(dǎo)致結(jié)果不一樣; 使用函數(shù)對象代替裸函數(shù)作為算法的輸入?yún)?shù)因為內(nèi)聯(lián),,在函數(shù)對象的方式中,內(nèi)聯(lián)有效,,而作為函數(shù)指針時,,一般編譯器都不會內(nèi)聯(lián)函數(shù)指針指向的函數(shù);即使指定了inline,; 比如:
這個調(diào)用不是真的把doubleGreater傳給sort,,它傳了一個doubleGreater的指針。
注:《effcient c++》中的實驗結(jié)論,,使用函數(shù)對象一般是裸函數(shù)的1.5倍,,最多能快2倍多 選擇合適的排序算法需要排序前思考我們的必要需求,可能我們只是需要前多少個元素,,這時并不需要使用sort這種線性時間的工具,,性能消耗更少的parttition可能是更好的選擇;
功能說明: 選擇合適的容器為什么vector不提供push_front()成員方法,?因為效率太差,如果有太多從前面插入的需求,,就不應(yīng)該使用vector,,而用list; 關(guān)心查找速度,,首先應(yīng)該考慮散列容器(非標準STL容器,如:unordered_map,unordered_set),;其次是排序的vector,然后是標準的關(guān)聯(lián)容器,; 參考《effictive STL》 《Efficient C++》 |
|