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


  • 相关阅读:
    HSV 量化
    小议:部署SharePoint 2013时,无法连接SQL Server问题
    BZOJ 1492 货币兑换 cdq分治或平衡树维护凸包
    初识ASP.NET---一般处理程序
    Vue.js
    jQuery内部原理和实现方式浅析
    关于js中namespace命名空间模式
    MutationObserver 监听DOM树变化
    TCP/UDP常见端口参考
    运算符优先级
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468427.html
Copyright © 2020-2023  润新知