STL中transform和for_each的区别和联系

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 v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	vector 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(_InIt,_InIt,_OutIt,_Fn1,
		std::tr1::true_type)”的引用
1>          with
1>          [
1>              _OutIt=std::_Vector_iterator>>,
1>              _InIt=int *,
1>              _Fn1=void (__cdecl *)(int &)
1>          ]
	*/

	/*
	template 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);
}

 

你可能感兴趣的:(c++)