【侯捷-sl體系結構核心分析-演算法】
目錄:accumulate
for_each
replace, replace_if, replace_copy 原始碼
accumulate 的原始碼如下。
template
<
class
_init
,class
_ty,
class
_fn>
_nodiscard inline _ty accumulate
(const _init _first,
const _init _last, _ty _val, _fn _reduce_op)
return
(_val)
;}
template
<
class
_init
,class
_ty>
_nodiscard inline _ty accumulate
(const _init _first,
const _init _last, _ty _val)
_val =
_reduce_op
(_val,
*_ufirst)
;
測試**int
myfunc
(int x,
int y)
struct myclass
}myobj;
void
test_accumulate()
;int result = std::
accumulate
(data, data +
3, ninit)
;// 100 + 10 + 20 + 30 = 160
std::cout << result << endl;
result = std::
accumulate
(data, data +
3, ninit, myfunc)
;// 100 + 2 * 10 + 2 * 20 + 2 * 30 = 220
std::cout << result << endl;
result = std::
accumulate
(data, data +
3, ninit, myobj)
;// 100 + 3 * 10 + 3 * 20 + 3 * 30 = 280
std::cout << result << endl;
}
注意點void
test_accumulate()
;float result = std::
accumulate
(data, data +
3, ninit)
; std::cout << result << endl;
}
正確的輸出應該是 61.2,但是實際輸出為 60,這是為什麼呢?
可以往前看看 accumulate 的源**,可以看到,計算結果的型別會根據傳入初值引數型別進行判斷,與容器數值型別並沒有關係,由於這裡傳入初值 ninit 為整形,所以每次累加時都會轉換成整型型別,最後輸出60。如果將 ninit 改為和容器資料型別相同浮點型別,就可以得出正確結果。
原始碼
template
<
class
_init
,class
_fn>
inline
_fn for_each
(_init _first, _init _last, _fn _func)
return
(_func)
;}
vector<
int> myvec = vector<
int>
;for
(auto i : myvec)
replace 原始碼
template
<
class
_fwdit
,class
_ty>
inline
void
replace
(const _fwdit _first,
const _fwdit _last,
const _ty& _oldval,
const _ty& _newval)
}}
replace_if 原始碼template
<
class
_fwdit
,class
_pr,
class
_ty>
inline
void
replace_if
(const _fwdit _first,
const _fwdit _last, _pr _pred,
const _ty& _val)
}}
replace_copy原始碼template
<
class
_init
,class
_outit
,class
_ty>
inline
_outit replace_copy
(_init _first, _init _last,
_outit _dest,
const _ty& _oldval,
const _ty& _newval)
else
}(_dest, _udest)
;return
(_dest)
;}
C STL原始碼分析 set和multiset
侯捷 sl體系結構核心分析 set和multiset探索 stl中assosiated container 比如 set 和 multiset 底層都是由紅黑樹作為支撐實現,所以在了解他們之前,有必要先來了解一下紅黑樹。template class traits class tree public ...
C STL 排序原始碼詳解(一)
全部以int型別的vector為處理物件 stl有關排序的幾個函式如下所示,需要更少資源 時間和空間 的演算法列在需要更多的前面,需要指出的是他們完成的工作是不一樣的。1.partition 4.partial sort 2.stable partition 5.sort 3.nth element...
Mangos原始碼分析 一)
mangos 原始碼分析 realmd 登陸伺服器 realmd 主程式 launch the realm server int main int argc,char argv h.add authlistensocket 進行一些引數設定 while stopevent 伺服器主迴圈 return...