for_each算法和transform算法区别

         对于for_each()算法和transform()算法更多基础的内容请参考以下两篇http://文章:

for_each()算法:点击打开链接

transform()算法:点击打开链接

         首先,for_each()算法和transform()算法都是属于变动性算法(modifying algorithms),它们都能改变序列中所有元素值,变动性算法的描述有以下两点体现:

1.直接改变元素;for_each()和transform()都具有这种能力。

2.复制到另一个区间的过程中改变元素的值,这种情况下,源区间的值不会发生变化;第二点只有transform()具有这种能力。

这两种算法在改变序列中所有元素的方式是不同的:

  • for_each()接受一项操作,该操作可以变动序列中的某个值。因此该参数必须以by reference方式传递,对Square函数返回值无要求。例如:
void Square(int &elem)
{
	elem = elem * elem;	//	assign new value
}

...

for_each(vecCollection.begin(), vecCollection.end(), Square);
  • transform()运用某项操作,该操作返回被改动后的参数,对调用的函数有返回值要求。例如:
int MultiplySelf(int elem)
{
	 return elem * elem;
}
...
for_each(vecCollection.begin(), vecCollection.end(), MultiplySelf);
通过for_each和transform算法实现可以有助于理解这个区别
	//for_each()算法实现
	for (; _ChkFirst != _ChkLast; ++_ChkFirst)
	{
		_Func(*_ChkFirst);//可以不需要返回值
	}	
	//transform算法实现
	for (; _First1 != _Last1; ++_First1, ++_First2, ++_Dest)
	{
		*_Dest = _Func(*_First1, *_First2);//有赋值操作,_Func需要有返回值
	}
其次,transform()的速度稍微慢些,因为它是将操作返回值赋值给元素,而不是直接变动元素。不过其灵活性比较高,它可以把某个序列复制到目标序列中,同时变动元素内容。transform的第二种形式还可以将两个源序列中的元素组合结果放到目标区间。


你可能感兴趣的:(STL)