天天看點

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

繼續閱讀