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);
}