STL學習筆記(七) 程序中使用STL

條款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相關站點
相關文章
相關標籤/搜索