舉個例子,假設我有乙個widget*指標的list和乙個函式來決定這樣的指標是否確定乙個感興趣的widget:
class
widget {};
bool isinsteresting(const widget* pw)
查詢第乙個感興趣的widget,這很容易:
auto iter = std:
:find_if(widgetptrs.begin(), widgetptrs.end(), isinsteresting);
但是如果我們想要獲取第乙個不感興趣的widget:
//c++17 not_fn replace : not1(c++03),not2(c++03)
auto iter_ = std::find_if(widgetptrs.begin(), widgetptrs.end(), std::not1(isinsteresting));
這樣編譯就會錯誤。原因是not1需要一些typedef的宣告,才能生效。
書上給的方法是使用ptr_func,不過我決定使用c++11的function來重新實現,以下兩種方式都可以實現。
std:
:function(const widget*)> pred =std:
:bind(&isinsteresting, _1);
std:
:function(const widget*)> pred_ = (constwidget*) -> bool ;
auto iter_ = std:
:find_if(widgetptrs.begin(), widgetptrs.end(), std:
:not1(pred));
auto iter__ = std:
:find_if(widgetptrs.begin(), widgetptrs.end(), std:
:not1(pred_));
在這裡說的適配就是這意思,不過unary_function等模板以及在c++11中棄用,被function代替了,所以該出就不書寫了。 Effective STL學習筆記 條款20
在這裡我們強調的是指標,先個例子 set ssp ssp.insert new ssp.insert new string lemon ssp.insert new string banana ssp.insert new string pear for auto str ssp 按照我們正常的想法...
Effective STL學習筆記 條款23
直接進入主題,為什麼會考慮使用vector代替關聯容器呢,可能有這樣的場景,一對關聯的資料,而時使用時要求資料查詢速度很快。當然我們必須知道有序的vector的缺點就是他必須保持有序,乙個新item插入可能造成其他元素的移動。所以這種場景可能在幾乎不插入和刪除時考慮。乙個例子 using pair ...
Effective STL學習筆記 條款30
看個例子 我們使用transform函式給乙個容器承載計算結果 vector src 待計算的資料 vector res 計算結果 src.push back 0 src.push back 1 src.push back 2 src.push back 3 std transform src.be...