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() 速度慢 很灵活
普通情况下: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的比較的更多相关文章
- STL常用遍历算法for_each和transform的比较
for_each()和transform()算法比较 1)STL 算法 – 修改性算法 for_each() copy() copy_backward() transform() merge ...
- C++ STL 常用遍历算法
C++ STL 常用遍历算法 STL的容器算法迭代器的设计理念 1) STL的容器通过类模板技术,实现数据类型和容器模型的分离 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了 ...
- C++进阶 STL(3) 第三天 函数对象适配器、常用遍历算法、常用排序算法、常用算数生成算法、常用集合算法、 distance_逆序遍历_修改容器元素
01昨天课程回顾 02函数对象适配器 函数适配器是用来让一个函数对象表现出另外一种类型的函数对象的特征.因为,许多情况下,我们所持有的函数对象或普通函数的参数个数或是返回值类型并不是我们想要的,这时候 ...
- STL六大组件之——算法小小小小的解析
参考自侯捷的<stl源码剖析> stl算法主要分为非可变序列算法(指不直接修改其所操作的容器内容的算法),可变序列算法(指可以修改它们所操作的容器内容的算法),排序算法(包括对序列进行排序 ...
- STL中的所有算法(70个)
STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...
- STL_算法_06_遍历算法
◆ 常用的遍历算法: 1.1.用指定函数依次对指定范围内所有元素进行迭代访问.该函数不得修改序列中的元素 functor for_each(iteratorBegin, iteratorEnd, fu ...
- STL学习笔记(算法概述)
算法头文件 要运用C++标准程序库的算法,首先必须包含头文件<algorithm> 使用STL算法时,经常需要用到仿函数以及函数配接器.它们定义域<functional>头文件 ...
- STL源码剖析(算法)
STL中算法是基于迭代器来实现的. 有了容器中迭代器的实现(对operator*.operator++等的重载),STL中大部分算法实现就显得很简单了. 先看一例关于find算法的实现: templa ...
- STL -- heap结构及算法
STL -- heap结构及算法 heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个 ...
随机推荐
- (翻译)与.NET容器映像保持同步
原文:https://blogs.msdn.microsoft.com/dotnet/2018/06/18/staying-up-to-date-with-net-container-images/ ...
- CentOS6安装后的常见基础优化
1.SSH优化 编辑/etc/ssh/sshd_config配置文件 //全部都应该设置为no /etc/ssh/sshd_config //服务端配置文件 /etc/ssh/ssh_config / ...
- JS获取网页高度和宽度
注:此文属于转载自他人博客 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: docume ...
- 用Logger来解释拦截
HZ 动态代理学了 不知道在工作中杂用哦 HE 现在一般不会直接用吧,一般都是用aspectJ这种完整aop的实现 STST 拦截方法调用 HZ 我见过把所有accessor方法放到切面的 还有tra ...
- 转:vscode中调试php
转:http://blog.csdn.net/x356982611/article/details/52664334 简介 PHP是动态语言没有调试器的话排错起来很是麻烦.vscode可以说是程序员的 ...
- Linux含交互的自动登录脚本
近来经常要通过ssh登录服务器,每次输入命令和密码很麻烦,查资料发现有两种解决,一种是本地创建密钥直接登录,另一种是写个脚本. 这里介绍第二种方法,第一种资料也很多,但是觉得没啥意思. 先上脚本: # ...
- PHP:过滤数组中为空的值,并将返回的数组使用数值键,从 0 开始并以 1 递增
首先了解下以下两个函数: 1.array_filter() 函数用回调函数过滤数组中的值. 2.array_values() 函数返回一个包含给定数组中所有键值的数组,但不保留键名.(被返回的数组将使 ...
- Codeforces #447 Div.2 Tutorial
Problem A:QAQ 给一个字符串,求出可非连续的QAQ序列有多少个. Analysis:比较水的一道题,记录每一个Q的位置,预处理A的个数即可 然而还是fst了,原因是未考虑一个Q都没有的极端 ...
- 【树形dp】Apple Tree
[poj2486]Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10800 Accepted: 3 ...
- 【折半枚举】Ural Championship April 30, 2017 Problem G. Glasses with solutions
题意:有n杯盐溶液,给定每杯里面盐的质量以及盐溶液的质量.问你有多少种方案选择一个子集,使得集合里面的盐溶液倒到一个被子里面以后,浓度为A/B. 折半枚举,暴力搜索分界线一侧的答案数,跨越分界线的答案 ...