C++中的transform方法实在头文件<algorithm>中定义的,这个函数的作用就是将源区间的元素复制到目标区间,还能将两个区间的元素合并,并将结果写入目标区间。函数原型为:

template<class InputIterator, class OutputIterator, class UnaryFunction>
OutputIterator transform(InputIterator first1,InputIterator last1,OutputIterator result,UnaryFunction func );template<class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction>
OutputIterator transform(InputIterator1 first1,InputIterator1 last1,InputIterator2 first2,OutputIterator result,BinaryFunction func );template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class UnaryOperation>
ForwardIterator2 transform(ExecutionPolicy&& exec,ForwardIterator1 first,ForwardIterator1 last,ForwardIterator2 result,UnaryOperation op);template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2, class ForwardIterator, class BinaryOperation>
ForwardIterator transform(ExecutionPolicy&& exec,ForwardIterator1 first1,ForwardIterator1 last1,ForwardIterator2 first2,ForwardIterator result,BinaryOperation binary_op);

我们就拿第一个函数原型为例子。我一直搞不懂最后一个参数,最后一个参数传递普通函数的指针我可以理解,但传入对象我就不怎么理解,关键在MSDN中传入的还是个这样的:

transform (v1.begin( ), v1.end( ), v1.begin( ), MultValue<int> ( 2 ) );

看到那个MultValue<int> ( 2 )没,对了这模板类是这样的:

template <class Type>
class MultValue
{
private:Type Factor;   // The value to multiply by
public:// Constructor initializes the value to multiply byMultValue ( const Type& value ) : Factor ( value ) { }// The function call for the element to be multipliedType operator( ) ( Type& elem ) const{return elem * Factor;}
};

首先,MultValue<int> ( 2 ),我可以理解为一个匿名类吗?(有没有大佬解答下),在VS2012中MultValue<int> ( 2 )是不报错而且还能调用构造函数。这样的话传入的是一个匿名类对象,那怎么里面还有个运算符重载呢?而且把他去掉就报错。我调试进入源码才发现了这个问题,里面的源码是这样的:

template<class _InIt,class _OutIt,class _Fn1> inline_OutIt _Transform(_InIt _First, _InIt _Last,_OutIt _Dest, _Fn1 _Func){ // transform [_First, _Last) with _Funcfor (; _First != _Last; ++_First, ++_Dest)*_Dest = _Func(*_First);return (_Dest);}

看到那个_Func(*_First)没,这时我才知道,如果没有重载运算符()这个就没有办法运行,因为对象已经创建了,这里只有可能是运算符重载,所以在class中要重载运算符()。总算想清楚了,我C++的基础还要加强啊。对了除了传入一个匿名类对象,也可以传入一个正常的对象,例如:

MultValue<int>temp(2); //初始化下参数
transform (v1.begin( ), v1.end( ), v1.begin( ), temp);//传入temp也可以

最后附上MSDN中的源码:

// alg_transform.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>// The function object multiplies an element by a Factor
template <class Type>
class MultValue
{
private:Type Factor;   // The value to multiply by
public:// Constructor initializes the value to multiply byMultValue ( const Type& value ) : Factor ( value ) { }// The function call for the element to be multipliedType operator( ) ( Type& elem ) const{return elem * Factor;}
};int main()
{using namespace std;vector<int> v1, v2 ( 7 ), v3 ( 7 );vector<int>::iterator Iter1, Iter2 , Iter3;// Constructing vector v1int i;for ( i = -4 ; i <= 2 ; i++ ){v1.push_back( i );}cout << "Original vector v1 = ( " ;for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )cout << *Iter1 << " ";cout << ")." << endl;// Modifying the vector v1 in placetransform (v1.begin( ), v1.end( ), v1.begin( ), MultValue<int> ( 2 ) );cout << "The elements of the vector v1 multiplied by 2 in place gives:"<< "\n v1mod = ( " ;for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )cout << *Iter1 << " ";cout << ")." << endl;// Using transform to multiply each element by a factor of 5transform ( v1.begin( ), v1.end( ), v2.begin( ), MultValue<int> ( 5 ) );cout << "Multiplying the elements of the vector v1mod\n "<< "by the factor 5 & copying to v2 gives:\n v2 = ( " ;for ( Iter2 = v2.begin( ) ; Iter2 != v2.end( ) ; Iter2++ )cout << *Iter2 << " ";cout << ")." << endl;// The second version of transform used to multiply the// elements of the vectors v1mod & v2 pairwisetransform ( v1.begin( ), v1.end( ), v2.begin( ), v3.begin( ),multiplies<int>( ) );cout << "Multiplying elements of the vectors v1mod and v2 pairwise "<< "gives:\n v3 = ( " ;for ( Iter3 = v3.begin( ) ; Iter3 != v3.end( ) ; Iter3++ )cout << *Iter3 << " ";cout << ")." << endl;
}

C++ 中transform方法的疑惑和自己的感受相关推荐

  1. MFC中GetDlgItemInt()方法的疑惑与使用总结

    MSDN中是这样描述CWnd::GetDlgItemInt方法的: UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = ...

  2. 关于AQS中enq( )方法CAS操作的疑惑

    private Node enq(final Node node) {for (;;) {Node t = tail;//如果队列为空则新建头结点if (t == null) { // Must in ...

  3. groupby+(apply+agg+transform)方法的比较

    groupby+(apply+agg+transform)方法的比较 分组函数groupby+(apply+agg+transform)方法的比较 pandas模块给数据处理的能力给予了很大的助力,但 ...

  4. 【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )

    文章目录 一.在 MyASTTransformation#visit 方法中进行方法拦截 二.完整代码示例及进行编译时处理的编译过程 1.Groovy 脚本 Groovy.groovy 2.ASTTr ...

  5. android transform xml xsl,XslCompiledTransform.Transform 方法 (System.Xml.Xsl) | Microsoft Docs

    使用 URI 指定的输入文档执行转换,然后将结果输出到 XmlWriter.Executes the transform using the input document specified by t ...

  6. XslTransform.Transform方法将结果输出到字符串

    XslTransform.Transform 方法将结果输出到字符串里有2中办法: 通过System.IO.MemoryStream类来实现. 通过System.Text.StringBuilder类 ...

  7. jdk8 string::_JDK 12的String :: transform方法的简要但复杂的历史

    jdk8 string:: 最近有人提议从JDK 12中删除Java预览功能Raw String Literals ( JEP 326 ), 现在正式宣布将删除该预览功能 ( Java SE 12 [ ...

  8. JDK 12的String :: transform方法的简要但复杂的历史

    最近有人建议从JDK 12中删除Java预览功能Raw String Literals ( JEP 326 ), 现在正式宣布将删除预览功能 ( Java SE 12 [JSR 386] 25版将其删 ...

  9. Python之分组级运算——【transform()方法、apply()方法】

    文章目录 数据转换--transform()方法 数据应用--apply()方法 数据转换--transform()方法 使用aggregate()方法进行聚合运算已经在上一篇博客中详细阐述,我们知道 ...

最新文章

  1. 简单明了,一文入门视觉SLAM
  2. 凝心聚力,共赢绿色计算新时代 ——2020绿色计算产业峰会在京召开
  3. 数字图像恢复matlab结论,matlab 模糊图像恢复 数字图像处理
  4. lambda 表达式中的 this 与普通情况下的 this 指向
  5. 视频编解码优化以及与AI的实践结合
  6. 如何在跑cts的时候生成log_为什么要买奥铃CTS?听听用户的评价
  7. [NewLife.XCode]反向工程(自动建表建库大杀器)
  8. boost::timer库使用
  9. springboot实现web文件上传,下载demo(附带demo链接)
  10. 「 英雄哪里出来 」算法博客阅读指引
  11. U盘插入计算机不显示图标,U盘插入电脑后不显示图标的应对措施
  12. 中职计算机应用和平面设计,中等职业教育十一五规划教材·中职中专计算机类教材系列·Photoshop平面设计与实训...
  13. This is probably not a problem with npm. There is likely additional logging 报错
  14. 了解资本与公司年报、财报
  15. 用vlookup函数就能判断你的Excel水平处于几段
  16. Stata: 交叉项\交乘项该这么分析!
  17. 用canvas和原生JS写的一个flappy bird游戏
  18. 【浙江大学计算机学院】ccnt实验室之,CCNT实验室
  19. Life Long Learning论文初探————Online Fast Adaptation and Knowledge Accumulation(OSAKA)
  20. 如何卸载Cygwin

热门文章

  1. HTML5 之 Figure Figcaption 标签
  2. 小米5s 小米6 MIUI 系统 删除温控 破解限制
  3. java程序员越来越多,为啥工资反而越来越高?
  4. 搭建各类游戏如何选择合适的服务器
  5. MLY翻译 -- 4.Scale drivers machine learning progress
  6. JavaSE基础知识(九)--Java中的方法重载(涉及基本类型的重载)
  7. 关于anchor的解释
  8. communicate(communicate with sb等于)
  9. js之css样式特效 ---- js篇
  10. 做教育怎么引流?教育行业怎么引流?培训机构引流如何转化?