对于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的第二种形式还可以将两个源序列中的元素组合结果放到目标区间。