首先看一下transform的原型
template < class InputIterator, class OutputIterator, class UnaryOperator > OutputIterator transform ( InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperator op ); template < class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperator > OutputIterator transform ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryOperator binary_op );
上面两个函数重载版本
1 是对原[first1, last1)之间所有和类型T,调用一个一元函数 op,然后把结果输出到result
2 是对原[first1, last1)之间所有和类型T,加上另一个参数也是从first开始,调用一个二元函数 op,然后把结果输出到result
其内部实现如下
template <class _InputIter, class _OutputIter, class _UnaryOperation>//模板参数,指定迭代器类型 _STLP_INLINE_LOOP _OutputIter transform(_InputIter __first, _InputIter __last, _OutputIter __result, _UnaryOperation __opr) { _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first, __last)) for ( ; __first != __last; ++__first, ++__result) *__result = __opr(*__first);//一元函数 return __result;//最后得到指向未尾的指针 } template <class _InputIter1, class _InputIter2, class _OutputIter, class _BinaryOperation> _STLP_INLINE_LOOP _OutputIter transform(_InputIter1 __first1, _InputIter1 __last1, _InputIter2 __first2, _OutputIter __result,_BinaryOperation __binary_op) { _STLP_DEBUG_CHECK(_STLP_PRIV __check_range(__first1, __last1)) for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result) *__result = __binary_op(*__first1, *__first2);//二元函数 return __result; }
函数调用读入每一行函数形式然后输出
#include <algorithm> #include <cctype> #include <iostream> using std::cin; using std::cout; int main() { std::string str; while(cin>>str){ std::transform(str.begin(),str.end(),str.begin(),tolower); cout<<str; } }
补充:另外一种调用函数如下:
vector<int> a; vector<int> b; for(int i=1;i<10;i++) a.push_back(i*10);// a 10 20 30 ...90 for(int i=1;i<10;i++) b.push_back(i*(-10)); //b -10 -20 ..-90 vector<int> c(10);//一定要先申请足够存放的空间 transorm(a.begin,a.end(),b.begin(),c.begin(),plus<int,int,int>()); // c 0 0 0 0 0 0 0 0 0