條款43:算法調用優先於手寫循環
class Widget { public: bool test(); }; vector<Widget> vec;
算法調用:算法
for_each(vec.begin(), vec.end(), mem_fun_ref(&Widget::test));
手寫循環:less
for(auto it = vec.begin(); it != vec.end(); ++it) it->test();
算法調用優於手寫循環:效率更高; 正確性更容易; 可維護性更高函數
條款44:容器的成員函數優於同名算法
優先使用容器的成員函數: 速度更快;與容器結合更緊密性能
set<int>::iterator it = s.find(2012); //T(n) = O(logn) set<int>::iterator it = find(s.begin(), s.end(), 2012); //T(n) = O(n)
使用關聯容器時,優先考慮使用成員函數形式的 find、count,能夠得到對數時間性能spa
list容器成員函數效率高於同名的STL算法函數(list容器的成員函數無需任何對象拷貝,僅僅維護指針)
注: list容器中 remove, remove_if, unique 不一樣於vector容器的先remove而後erase用法, list容器是實實在在刪除元素,因此無需再erase
注: STL的sort算法不能用於list容器(由於sort須要隨機訪問迭代器), list::sort()是穩定算法指針
條款45:正確區分 count,find, binary_search, lower_bound, upper_bound, equal_range
在選擇具體的查找策略時,首先須要考慮迭代器制定的區間是否有序,若是有序,可使用 binary_search, lower_bound, upper_bound, equal_range
binary_search 返回值爲 bool,僅僅代表查找值是否在有序序列中code
equal_range 返回一對迭代器:
第一個迭代器等於 lower_bound 返回的迭代器,指向第一個與查找值相等的元素
第二個迭代器等於 upper_bound 返回的迭代器,指向最後一個與查找值相等元素的下一個元素
1.若是返回的兩個迭代器相等,則代表沒有找到欲查找值(經過這個特性進行檢查最終查找結果)
2.有序序列中存在多少個元素與查找值相等: distance(it.first, it.second); //計算返回的兩個迭代器之間的距離對象
條款46:考慮使用函數對象而不是函數做爲STL算法的參數
vector<double> vec; sort(vec.begin(), vec.end(), greater<double>()); //使用標準函數對象,不要本身寫一個comp函數
當將一個函數進行參數傳遞時,其實傳遞的是該函數指針:blog
sort(vector<double>::iterator first, vector<double>::iterator last, bool (*comp)(double, double));
函數指針參數抑制了內斂機制,而標準STL函數對象使用了內斂機制,因此sort比qsort快開發
條款47:避免產生"write only"代碼
寫清晰的代碼,避免編寫很是複雜的複合語句,軟件的維護比開發過程一般消耗更長的時間
條款48:老是#include正確的頭文件
1.幾乎全部的標準STL容器都聲明在與之同名的頭文件中
2.除了4個STL算法以外,其他全部算法聲明在<algorithm>中,這4個算法是 accumulate, inner_product, adjacent_difference, partial_sum 這4個聲明在<numeric>中
3.全部迭代器聲明在<iterator>中
4.標準函數子(如 less<T>), 函數適配器(bind2nd) 聲明在<functional>中
條款49:學會分析與STL相關的編譯器診斷信息
條款50:熟悉與STL相關站點