transform算法



transform()的第一版本以仿函数op作用于[first,last)中的每一个元素身上,并以其结果产生出一个新序列。第二版本以仿函数binary_op作用于一双元素身上(其中一个元素来自[first1,last1),另一个元素来自“从first2开始的序列”),并以其结果产生出一个新序列。如果第二序列的元素少于第一序列,执行结果未可预期。

//版本一

template <class InputIterator,class OutputIterator,class UnaryOperation>

OutputIterator transform(InputIterator first,InputIterator last,

OutputIterator result,UnaryOperation op)

{

for (;first != last;++first,++result)

*result = op(*first);

return result;

}

//版本二

template <class InputIterator1,class InputIterator2,class OutputIterator,

class BinaryOperation>

OutputIterator transform(InputIterator1 first1,InputIterator1 last1,

InputIterator2 first2,OutputIterator result,BinaryOperation binary_op)

{

for (;first1 != last1;++first1,++first2,++result)

*result = binary_op(*first1,*first2);

return result;

}

transform通过赋值操作将结果写到写到目标区间中。所以下面的代码将有一个错误:

int transmogrify(int x);

vector<int> values;

...

vector<int> results;

transform(values.begin(),values.end(),results.end(),transmogrify);

在*results.end()中并没有对象,这种transform调用时错误的,因为它导致了对无效对象的赋值操作。如果希望将结果添加到results容器的末尾,我们可以通过调用back_inserter生成一个迭代器来指定目标区间的起始位置:

vector<int> results;

transform(values.begin(),values.end(),back_inserter(results),transmogrify);

在内部,back_inserter返回的迭代器将使得push_back被调用,所以back_inserter可适用于所有提供了push_back方法的容器(vector,list,string,deque)。

如果需要在容器的头部而不是尾部插入对象,则可以使用front_inserter。front_inserter在内部使用了push_front,所以front_inserter仅适用于那些提供了push_front成员函数的容器(如deque和list)。

...

list<int> results;

transform(values.begin(),values.end(),front_inserter(results),transmogrify);

由于front_inserter将通过push_front来加入每个对象,所以这些对象在results中的顺序将与在values中的顺序相反。这正是为什么front_inserter不如back_inserter常用的原因之一。另一个原因是,vector并没有提供push_front方法,所以无法针对vector使用front_inserter。下面是一种解决方法:

list<int> results;

transform(values.rbegin(),values.rend(),front_inserter(results),transmogrify);

如果插入操作的目标容器时vector和string,则可以预先调用reserve,从而提高插入操作的性能,避免因重新分配容器内存而带来的开销。

假设希望transform覆盖results容器中已有的元素,那么就需要确保results中已有的元素至少和values中的元素一样多。否则,就必须使用resize来保证这一点:

vector<int> values;

vector<int> results;

...

if(results.size()<values.size())

{

results.resize(values.size());

}

transform(values.begin(),values.end(),results.begin(),transmogrify);

transform算法

时间: 2024-10-04 11:59:09

transform算法的相关文章

[转]STL transform算法中使用toupper函数

原文转自 http://blog.csdn.net/justin12zhu/article/details/5649236 今天需要实现一个把小写字母转换为大写字母的函数,由于传入的参数是STL中的string类,所以第一想法就是用transform算法来实现这功能,但是报错了.回家之后写了下面一个测试代码来看看到底错在哪里和怎么解决. #include <iostream> #include <algorithm> #include <cctype> using na

C++11 lambda表达式在for_each和transform算法下的使用

以前,在lambda表达式没有进入标准的时候,对容器的遍历等涉及到使用函数指针的情况,一般人会懒得使用std::for_each,或std::transform,也许只是一个短短的几句话,却要单独写个函数,或函数对象,写的代码反而不如自己用for循环来的快. 但是,C++11引入了lambda表达式后,一切都变的简单了! 1.lambda表达式 lambda表达式是一个匿名函数,用它可以非常方便的表示一个函数对象,先简单说一下lambda表达式,下面这张图表示了C++11中lambda表达式的写

C++探究transform算法

transform函数原型 1. template<class _InIt, class _OutIt, class _Fn1> inline _OutIt transform(_InIt _First, _InIt _Last, _OutIt _Dest, _Fn1 _Func) { // transform [_First, _Last) with _Func _DEPRECATE_UNCHECKED(transform, _Dest); return (_Transform_no_dep

STL经常使用遍历算法for_each和transform的比較

for_each()和transform()算法比較 1)STL 算法 – 改动性算法 for_each() copy() copy_backward() transform() merge() swap_ranges() fill() fill_n() generate() generate_n() replace replace_if() replace_copy() replace_copy_if() 2) for_each() 速度快 不灵活 transform() 速度慢 很灵活 普通

STL常用遍历算法for_each和transform的比较

for_each()和transform()算法比较 1)STL 算法 – 修改性算法 for_each() copy() copy_backward() transform() merge() swap_ranges() fill() fill_n() generate() generate_n() replace replace_if() replace_copy() replace_copy_if() 2) for_each() 速度快 不灵活 transform() 速度慢 非常灵活 一

stl变易算法(二)

本篇接着前篇stl变易算法(一)继续讲述变易算法.主要介绍transform.replace.replace_if.replace_copy以及replace_copy_if的用法及实现代码,并给出测试用例. 元素变换transform transform算法用于实行容器元素的变换操作.如下两个使用原型,一个将迭代器区间[first,last)中元素,执行一元函数对象op操作,变换后的结果存放在[result,result+(last-first))区间中.另一个将迭代器区间[first1,la

计算机视觉目标跟踪的算法分类

摘自百度百科............. (1)基于区域的跟踪算法 基于区域的跟踪算法基本思想是:将目标初始所在区域的图像块作为目标模板,将目标模板与候选图像中所有可能的位置进行相关匹配,匹配度最高的地方即为目标所在的位置.最常用的相关匹配准则是差的平方和准则,(Sum of Square Difference,SSD). 起初,基于区域的跟踪算法中所用到的目标模板是固定的,如 Lucas 等人提出 Lucas-Kanade 方法,该方法利用灰度图像的空间梯度信息寻找最佳匹配区域,确定目标位置.之

STL的容器算法迭代器的设计理念

1) STL的容器通过类模板技术,实现数据类型和容器模型的分离. 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了统一性. 3) STL的函数对象实现了自定义数据类型的算法运算 核心思想:其实函数对象本质就是回调函数,回调函数的思想,就是任务的编写者和任务的调用者有效解耦合,函数指针做函数参数. 4) 具体例子:transform算法的输入,通过迭代器first和last指向的元算作为输入:通过result作为输出:通过函数对象来做自定义数据类型的运算. 版权声明:本文为

关于统计变换(CT/MCT/RMCT)算法的学习和实现

原文地址http://blog.sina.com.cn/s/blog_684c8d630100turx.html 刚开会每周的例会,最讨厌开会了,不过为了能顺利毕业,只能忍了.闲话不多说了,下面把上周学习的一个简单的算法总结一下,以备后面写毕业论文的时候可以参考一下. 一.Census Transform(CT)算法的学习 Census Transform 算法是Ramin Zabih 和 John Woodfill 于1994年在他们的论文<Non-parametric LocalTransf