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;
}
最后一点,函数返回目标区间内最后一个而被转换元素的下一位置,也即未被覆盖的元素的位置.