for_each: 周遊元素,函數對象參數一般使用引用,沒有傳回值
transform:變換元素,可以将一個容器内的内容變換到另外一個容器,也可以将兩個容器内的内容變換到另外一個容器,函數對象一般不适用引用(因為涉及到容器間的内容轉移和變換,使用引用可能會導緻不可避免的麻煩),函數對象有傳回值。
看一下下面的代碼:
//一般情況下:for_each所使用的函數對象,參數是引用,沒有傳回值
//transform所使用的函數對象,參數一般不使用引用,而是還有傳回值
void showElem(int &n)
{
cout << n << " ";
}
int showElem2(int n)
{
cout << n << " ";
return n;
}
void main43_transform_pk_foreach()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
vector<int> v2 = v1;
for_each(v1.begin(), v1.end(), showElem);
//transform 對 函數對象的要求
/*
c:\program files\microsoft visual studio 10.0\vc\include\algorithm(1119):
參見對正在編譯的函數 模闆 執行個體化
“_OutIt std::_Transform1<int*,_OutIt,
void(__cdecl *)(int &)>(_InIt,_InIt,_OutIt,_Fn1,
std::tr1::true_type)”的引用
1> with
1> [
1> _OutIt=std::_Vector_iterator<std::_Vector_val<int,std::allocator<int>>>,
1> _InIt=int *,
1> _Fn1=void (__cdecl *)(int &)
1> ]
*/
/*
template<class _InIt,
class _OutIt,
class _Fn1> inline
_OutIt _Transform(_InIt _First, _InIt _Last,
_OutIt _Dest, _Fn1 _Func)
{ // transform [_First, _Last) with _Func
for (; _First != _Last; ++_First, ++_Dest)
*_Dest = _Func(*_First); //解釋了 為什麼 要有傳回值
return (_Dest);
}
*/
transform(v2.begin(), v2.end(), v2.begin(), showElem2);
}