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() 速度慢 很灵活

普通情况下:for_each所使用的函数对象,參数是引用,没有返回值

transform所使用的函数对象,參数一般不使用引用,而是还有返回值

int showElem2(int n)
{
cout << n << " ";
return n;
} void main43_transform_pk_foreach()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5); vector<int> v2 = v1; for_each(v1.begin(), v1.end(), showElem); //transform 对 函数对象的要求
/*
c:\program files\microsoft visual studio 10.0\vc\include\algorithm(1119):
參见对正在编译的函数 模板 实例化
“_OutIt std::_Transform1<int*,_OutIt,
void(__cdecl *)(int &)>(_InIt,_InIt,_OutIt,_Fn1,
std::tr1::true_type)”的引用
1> with
1> [
1> _OutIt=std::_Vector_iterator<std::_Vector_val<int,std::allocator<int>>>,
1> _InIt=int *,
1> _Fn1=void (__cdecl *)(int &)
1> ]
*/ /*
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); //解释了 为什么 要有返回值
return (_Dest);
}
*/
transform(v2.begin(), v2.end(), v2.begin(), showElem2);
}

demo 完整的演示了for_each和transform算法的使用方法。以及

#include <iostream>
#include <cstdio>
#include <vector>
#include <list>
#include <algorithm>
#include <functional>
#include <iterator> using namespace std; class CMyShow
{
public:
CMyShow()
{
num = 0;
}
void operator()(int &n)
{
num++;
cout << n << " ";
}
void printNum()
{
cout << "num:" << num << endl;
}
protected:
private:
int num;
}; void printV(vector<int> &v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
} void printList(list<int> &v)
{
for (list<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
} void showElem(int &n)
{
cout << n << " ";
} // for_each函数使用方法
void play_for_each()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5); printV(v1);
cout << endl; /*
template<class _InIt,
class _Fn1> inline
_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{ // perform function for each element
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Func);
return (_For_each(_Unchecked(_First), _Unchecked(_Last), _Func));
} */ //函数对象 回调函数入口地址
for_each(v1.begin(), v1.end(), showElem);
cout << endl; for_each(v1.begin(), v1.end(), CMyShow());
cout << endl; CMyShow mya;
CMyShow my1 = for_each(v1.begin(), v1.end(), mya); //给my1初始化
mya.printNum(); //ma1和my1 是两个不同的对象
my1.printNum(); my1 = for_each(v1.begin(), v1.end(), mya); //给my1赋值
my1.printNum();
} int increase(int i)
{
return i + 100;
} // transform函数使用方法
void play_transform()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5); printV(v1);
cout << endl; //transform 使用回调函数
transform(v1.begin(), v1.end(), v1.begin(), increase);
printV(v1);
cout << endl; //transform 使用 提前定义的函数对象
transform(v1.begin(), v1.end(), v1.begin(), negate<int>());
printV(v1);
cout << endl; //transform 使用 函数适配器 和函数对象
list<int> mylist;
mylist.resize(v1.size()); transform(v1.begin(), v1.end(), mylist.begin(), bind2nd(multiplies<int>(), 10));
printList(mylist);
cout << endl; //transform 也能够把运算结果 直接输出到屏幕
transform(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "), negate<int>());
cout << endl;
} //普通情况下:for_each所使用的函数对象,參数是引用。没有返回值
//transform所使用的函数对象,參数一般不使用引用,而是还有返回值 int showElem2(int n)
{
cout << n << " ";
return n;
} void play_transform_pk_foreach()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5); vector<int> v2 = v1; for_each(v1.begin(), v1.end(), showElem); //transform 对 函数对象的要求
/*
c:\program files\microsoft visual studio 10.0\vc\include\algorithm(1119):
參见对正在编译的函数 模板 实例化
“_OutIt std::_Transform1<int*,_OutIt,
void(__cdecl *)(int &)>(_InIt,_InIt,_OutIt,_Fn1,
std::tr1::true_type)”的引用
1> with
1> [
1> _OutIt=std::_Vector_iterator<std::_Vector_val<int,std::allocator<int>>>,
1> _InIt=int *,
1> _Fn1=void (__cdecl *)(int &)
1> ]
*/ /*
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); //解释了 为什么 要有返回值
return (_Dest);
}
*/
transform(v2.begin(), v2.end(), v2.begin(), showElem2);
} int main()
{
play_for_each();
play_transform();
play_transform_pk_foreach(); return 0;
}

STL经常使用遍历算法for_each和transform的比較的更多相关文章

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

    for_each()和transform()算法比较 1)STL 算法 – 修改性算法  for_each()  copy()  copy_backward()  transform()  merge ...

  2. C++ STL 常用遍历算法

    C++ STL 常用遍历算法 STL的容器算法迭代器的设计理念 1) STL的容器通过类模板技术,实现数据类型和容器模型的分离 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了 ...

  3. C++进阶 STL(3) 第三天 函数对象适配器、常用遍历算法、常用排序算法、常用算数生成算法、常用集合算法、 distance_逆序遍历_修改容器元素

    01昨天课程回顾 02函数对象适配器 函数适配器是用来让一个函数对象表现出另外一种类型的函数对象的特征.因为,许多情况下,我们所持有的函数对象或普通函数的参数个数或是返回值类型并不是我们想要的,这时候 ...

  4. STL六大组件之——算法小小小小的解析

    参考自侯捷的<stl源码剖析> stl算法主要分为非可变序列算法(指不直接修改其所操作的容器内容的算法),可变序列算法(指可以修改它们所操作的容器内容的算法),排序算法(包括对序列进行排序 ...

  5. STL中的所有算法(70个)

    STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...

  6. STL_算法_06_遍历算法

    ◆ 常用的遍历算法: 1.1.用指定函数依次对指定范围内所有元素进行迭代访问.该函数不得修改序列中的元素 functor for_each(iteratorBegin, iteratorEnd, fu ...

  7. STL学习笔记(算法概述)

    算法头文件 要运用C++标准程序库的算法,首先必须包含头文件<algorithm> 使用STL算法时,经常需要用到仿函数以及函数配接器.它们定义域<functional>头文件 ...

  8. STL源码剖析(算法)

    STL中算法是基于迭代器来实现的. 有了容器中迭代器的实现(对operator*.operator++等的重载),STL中大部分算法实现就显得很简单了. 先看一例关于find算法的实现: templa ...

  9. STL -- heap结构及算法

    STL -- heap结构及算法 heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个 ...

随机推荐

  1. CentOS7安装和配置vsftpd

    (1)vsftpd基本介绍 作用:实现文件共享 1)vsftpd两种模式 主动模式 所谓主动模式,指的是FTP服务器"主动"去连接客户端的数据端口来传输数据,其过程具体来说就是:客 ...

  2. Bootstrap Table 使用示例及代码

    http://issues.wenzhixin.net.cn/bootstrap-table/ <!DOCTYPE html> <html> <head> < ...

  3. TYVJ2002 扑克牌

    卢克生日那天,汉来找卢克玩扑克牌,玩着玩着汉觉得太没意思了,于是决定给卢克一个考验汉把一副扑克牌(54张)随机洗匀,倒扣着放成一摞.然后卢克从上往下一次翻开每张牌,每翻开一张黑桃,红桃,梅花或方块,就 ...

  4. 洛谷——P1177 【模板】快速排序

    P1177 [模板]快速排序. 题目描述 利用快速排序算法将读入的N个数从小到大排序后输出. 快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成. ...

  5. 关于使用jqmobi前端框架在phonegap平台上开发时的日期时间选择控件

    jqmobi(appframework)作为Intel的一款html5移动前端框架,以其自身轻量级和容易上手获得了很多移动HTML5开发者的喜爱,相对于jquerymobile,它可以说将jQuery ...

  6. DP套DP

    DP套DP,就是将内层DP的结果作为外层DP的状态进行DP的方法. [BZOJ3864]Hero meet devil 对做LCS的DP数组差分后状压,预处理出转移数组,然后直接转移即可. tr[S] ...

  7. 【强连通分量缩点】【拓扑排序】【dp预处理】CDOJ1640 花自飘零水自流,一种相思,两处闲愁。

    题意: 在n个点m条边的有向图上,从1出发的回路最多经过多少个不同的点 可以在一条边上逆行一次 题解: 在同一个强连通分量中,显然可以经过当中的每一个点 因此先将强连通分量缩点,点权为强连通分量的点数 ...

  8. 【概率DP】BZOJ4318-OSU!

    [题目大意] 一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串.在这个串中连续的 X个1可以贡献X^3 的分数,这x个1不能被其他连续的1所包含( ...

  9. (1)CorePlot配置

    先来看一下官方的说法,贴内容(https://code.google.com/p/core-plot/wiki/UsingCorePlotInApplications) Dependent Proje ...

  10. MySQL v5.7.18 版本解压安装

    下载MySQL https://dev.mysql.com/downloads/mysql/5.1.html#downloads 个人机子是64位的,所以选择下载:Windows (x86, 64-b ...