transform详解

41 篇文章 0 订阅
39 篇文章 2 订阅

transform:

形式一:transform(begSrc,endSrc,begDest,Fun)
函数功能:[begSrc,endSrc)运用Fun操作,并将返回值赋值给begDest.

其中Fun的形式为:T (Fun*)(T)

这里需要注意begDest需要的区间要求是最少大于distance[begSrc,endSrc).否则将会引起覆盖.

template<class _InIt,

         class_OutIt,

         class_Fn1> inline

         _OutIt transform(_InIt _First, _InIt_Last,

                   _OutIt _Dest, _Fn1 _Func)

         {       // transform [_First, _Last) with _Func

         _DEBUG_RANGE(_First, _Last);

         _DEBUG_POINTER(_Dest);

         _DEBUG_POINTER(_Func);

         if(_First != _Last)

                   return(_Transform1(_Unchecked(_First), _Unchecked(_Last),

                            _Dest, _Func,_Is_checked(_Dest)));

         return(_Dest);

         }

template<class _InIt,

         class_OutIt,

         class_Fn1> inline

         _OutIt _Transform1(_InIt _First, _InIt_Last,

                   _OutIt _Dest, _Fn1 _Func,_STD tr1::true_type)

         {       // transform [_First, _Last) with _Func, checked dest

         return(_Transform1(_First, _Last,

                   _Dest, _Func,

                   _Iter_cat(_First),_Iter_cat(_Dest)));

         }

template<class _InIt,

         class_OutIt,

         class_Fn1> inline

         _OutIt _Transform1(_InIt _First, _InIt_Last,

                   _OutIt _Dest, _Fn1 _Func,

                   input_iterator_tag,output_iterator_tag)

         {       // transform [_First, _Last) with _Func, arbitraryiterators

         return(_Transform(_First, _Last,

                   _Dest, _Func));

         }

                   //TEMPLATE FUNCTION transform WITH UNARY OP

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);  // 这里需要说明的一点是,如果Dest是使用back_inserter迭代器时,

// 其实back_inserter在其内部重载了=操作符,

// 它所做的就是push_back操作

         return(_Dest);

         }

形式二:

transform(begSrc1,endSrc1,begSrc2,begDest,Fun)

函数功能:将[begSrc,endSrc1)和[begSrc,...)运用Fun,并将函数返回值赋值给begDest.

这里同样需要注意begSrc2,begDest要足够大.而Fun的形式则为T (fun*)(T,T)

template<class _InIt1,

         class_InIt2,

         class_OutIt,

         class_Fn2> inline

         _OutIt transform(_InIt1 _First1, _InIt1_Last1,

                   _InIt2 _First2, _OutIt _Dest,_Fn2 _Func)

         {       // transform [_First1, _Last1) and [_First2, ...) with_Func

         _DEBUG_RANGE(_First1, _Last1);

         _DEBUG_POINTER(_Dest);

         _DEBUG_POINTER(_Func);

         if(_First1 != _Last1)

                   return(_Transform2(_Unchecked(_First1), _Unchecked(_Last1),

                            _First2, _Dest,_Func,

                            _Is_checked(_Dest)));

         return(_Dest);

         }

 

template<class _InIt1,

         class_InIt2,

         class_OutIt,

         class_Fn2> inline

         _OutIt _Transform2(_InIt1 _First1,_InIt1 _Last1,

                   _InIt2 _First2, _OutIt _Dest,_Fn2 _Func,

                   _STD tr1::true_type)

         {       // transform [_First1, _Last1) and [_First2, ...), checkeddest

         return(_Transform2(_First1, _Last1,

                   _First2, _Dest, _Func,

                   _Iter_cat(_First1), _Iter_cat(_First2)));

         }

template<class _InIt1,

         class_InIt2,

         class_OutIt,

         class_Fn2> inline

         _OutIt _Transform2(_InIt1 _First1,_InIt1 _Last1,

                   _InIt2 _First2, _OutIt _Dest,_Fn2 _Func,

                   random_access_iterator_tag,random_access_iterator_tag)

         {       // transform [_First1, _Last1) and [_First2, ...),random-access input

         _InIt2 _Last2 = _First2 + (_Last1 -_First1);     //also checks range

         _Last2 = _Last2;      // to quiet diagnostics

         return(_Transform3(_First1, _Last1,

                   _Unchecked(_First2), _Dest,_Func,

                   _Iter_cat(_First1),_Iter_cat(_Dest)));

         }

template<class _InIt1,

         class_InIt2,

         class_OutIt,

         class_Fn2> inline

         _OutIt _Transform3(_InIt1 _First1,_InIt1 _Last1,

                   _InIt2 _First2, _OutIt _Dest,_Fn2 _Func,

                   input_iterator_tag,output_iterator_tag)

         {       // transform [_First1, _Last1) and [_First2, ...),arbitrary dest

         return(_Transform(_First1, _Last1,

                   _First2, _Dest, _Func));

         }

                   //TEMPLATE FUNCTION transform WITH BINARY OP

template<class _InIt1,

         class_InIt2,

         class_OutIt,

         class_Fn2> inline

         _OutIt _Transform(_InIt1 _First1,_InIt1 _Last1,

                   _InIt2 _First2, _OutIt _Dest,_Fn2 _Func)

         {       // transform [_First1, _Last1) and [_First2, ...) with_Func

         for (;_First1 != _Last1; ++_First1, ++_First2, ++_Dest)

                   *_Dest = _Func(*_First1,*_First2);

         return(_Dest);

         }

 

举例:

template<typenameT>

T add10( T _value1 )

{

         return_value1 += 10;

}

template<typenameT>

T multi10( T lhs,Trhs )

{

         returnlhs + rhs;

}

int main()

{

         vector<int>vecInt;

         for ( int i = 0;i < 10;++ i)

         {

                   vecInt.push_back( i );

         }

 

         vector<int>vecIntOther;

         cout<<"transform:one";

         transform(vecInt.begin(),vecInt.end(),back_inserter( vecIntOther ),add10<int> );

         copy(vecIntOther.begin(),vecIntOther.end(),ostream_iterator<int>( cout,"" ) );

 

         cout<<"\ntransform:two\n";

         //Á¡é°a:¡ìª¨°?°a¨°¨??a¨´¨´Á¡Â.°¨°aback_inserter¨²transform?DÌ?y¨¬D¨¢?À?vecIntOtherÌ?Á¡ä¬?(¡ä?a?)

         //transform(vecIntOther.begin(),vecIntOther.end(),vecIntOther.begin(),back_inserter(vecIntOther ),multi10<int> );

         transform( vecIntOther.begin(),vecIntOther.end(),vecIntOther.begin(),back_inserter(vecInt ),multi10<int> );

         copy(vecInt.begin(),vecInt.end(),ostream_iterator<int>(cout," " ) );

         system( "pause");

         return0;

}

最后一点,函数返回目标区间内最后一个而被转换元素的下一位置,也即未被覆盖的元素的位置.

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值