首先回顧前面的文章,我們把for_each 歸類為非變動性算法,實際上它也可以算是變動性算法,取決于傳入的第三個參數,即函數
指針。如果在函數内對容器元素做了修改,那麼就屬于變動性算法。
變動性算法源代碼分析與使用示例:
一、copy、copy_backward
copy 調用了_Copy_opt,在此函數内遞增疊代器,從前兩個參數指定的區間内取出元素并拷貝到對應_Dest位置上。
for (; _First != _Last; ++_Dest, ++_First)
*_Dest = *_First;
copy_backward 調用了_Copy_backward_opt,與copy 不同的是實作反向拷貝,即從尾端開始拷貝,是以是遞減疊代器。
while (_First != _Last)
*--_Dest = *--_Last;
示例代碼1:

二、transfrom
實際上transfrom 重載了兩個版本,一個是四個參數的,即将前兩個參數指定區間内的元素執行某種操作(函數内)後拷貝到第三個
參數訓示的區間上。而另一個版本是五個參數的,即将兩個區間的對應元素進行某種操作後拷貝到第三個區間上去。核心的代碼區
别在于下面兩行:
*_Dest = _Func(*_First);
*_Dest = _Func(*_First1, *_First2);
示例代碼2:
輸出為 :
2 4 6 8 10
5 7
三、replace、replace_copy、replace_copy_if
replace 帶4個參數,将前兩個參數訓示的區間元素值為_Oldval 的替換成_Newval。
if (*_First == _Oldval)
*_First = _Newval;
replace_copy 帶5個參數,先判斷前兩個參數訓示區間的元素是否是_Oldval,若是則替換成_Newval 指派到第三個參數訓示的區間上,否則直接指派
*_Dest = *_First == _Oldval ? _Newval : *_First;
replace_copy_if 帶5個參數,在每個元素拷貝時先判斷是否滿足條件(函數傳回為真),滿足則替換成_Val,否則保持不變。
*_Dest = _Pred(*_First) ? _Val : *_First;
示例代碼3:
輸出為:
1 2 13 4 13
1 2 3 4 3
0 0 13 0 13
參考:
C++ primer 第四版
Effective C++ 3rd
C++程式設計規範