天天看點

從零開始學C++之STL(六):變動性算法源代碼分析與使用示例(copy_backward、 transform、 replace_copy_if 等)

首先回顧前面的文章,我們把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:

從零開始學C++之STL(六):變動性算法源代碼分析與使用示例(copy_backward、 transform、 replace_copy_if 等)

二、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++程式設計規範