C STL原始碼分析 演算法(一)

2021-10-03 09:07:32 字數 2979 閱讀 2593

【侯捷-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...