STL提供了transform()算法。该算法既实现将源容器(源区间)的元素复制到目标区间,复制和修改元素一气呵成;也可以实现两个区间的元素合并,最终将结果写入目标区间。其原型为:
第一种形式实现的功能:针对[sourceBeg,sourceEnd]中的每个元素均调用uop(ele)函数,并将结果写入到以destBeg为起始的目标区间内。其返回值是“最后一个被转换元素”的下一个位置。在使用该形式时,必须确保具有足够的空间存放这些元素,否则需要使用插入型迭代器。transform()算法可以修改序列中每个元素,这方面和for_each()算法相似。
第二种形式实现的功能:针对[first1,last1]中的每个元素,与从first2开始的第二个源区间的对应元素,调用函数或规则bop(ele1,ele2),并将结果写入以x为起始的目标区间。其返回值和第一种形式相同。在使用时,程序员需要确定第二源区间具有足够的容器,至少具有和第一源区间同样的容量。在使用过程中,程序员要确保具有足够的空间(容量),否则需要使用插入型迭代器。值得一提的是,两个源区间可以相同,目标区间也可以和源区间相同。
下面以例4-16说明transform()算法的使用方法。
例4-16
例4-16的执行效果如图4-16所示。
图4-16 例4-16的执行效果(www.xing528.com)
请读者参照程序的执行结果,对照源代码和注释,仔细体会transform()算法的用途和使用方法。transform()算法既可以使用STL既定的函数或仿函数作为规则,也可以使用自定义的函数或仿函数作为自定义规则。自定义规则参见例4-17。例4-17使用仿函数的形式实现了transform()算法的自定义规则传递。自定义类作为仿函数使用,即可以编写任意算法,实现预想的transform()功能,从而实现程序员的预想目的。
例4-17
例4-17的执行效果如图4-17所示。
图4-17 例4-17的执行效果
总结
1)例4-17中定义了两个仿函数类。请读者认真阅读第二个仿函数类,此仿函数是按照transform()算法的第二种形式编写的。
2)main()函数的末尾包含了6行注释语句,前两行是一组,后4行是一组,可以使用该两组代码替换main()函数中第二种形式的transform()算法的使用,即main()函数中代码第16行~第19行。
3)例4-17较完整地阐释了transform()算法的自定义规则,同时在本书中第一次给出了多参数的仿函数例子,有利于拓开读者的思路和视野,为读者今后编写出更好的仿函数打下基础。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。