1,实例代码:
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
//自定义可以调整的函数对象
class MyAdd : public binary_function<int,int,int>
{
public:
MyAdd(){}
//注意const
int operator()(int m,int n) const
{
return m+n;
}
};
bool isOdd(int d){ return d&0x01; }
int myAdd(int m,int n ){ return m+n; }
int main()
{
ostream_iterator<int> out(cout, " ") ;
int a[]={1,3,4,5,8,9};
int size=sizeof(a)/sizeof(a[0]);
transform(a,a+size,a,bind2nd(MyAdd(),100));
copy(a,a+size,out);
cout<<endl;
/*
ptr_fun的使用:将函数转化为函数对象,函数必须是一元或二元函数
*/
//判断是否为偶数
vector<bool> vb;
transform(a,a+size,back_inserter(vb),not1(ptr_fun(isOdd)));
copy(vb.begin(),vb.end(),out);
cout<<endl;
//实现了相同的功能,加一个数
vector<int> vecint;
transform(a,a+size,back_inserter(vecint),bind1st(ptr_fun(myAdd),1000));
copy(vecint.begin(),vecint.end(),out);
cout<<endl;
}
2,mem_fun:序列元素为对象的指针,将成员函数转化为函数对象.
mem_fun_ref:序列元素为对象,将成员函数转化为函数对象.
实例代码1:
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
class Shape
{
public:
virtual void draw() = 0;
virtual ~Shape() {}
};
class Circle : public Shape
{
public:
virtual void draw() { cout << "Circle::Draw()" << endl; }
~Circle() { cout << "Circle::~Circle()" << endl; }
};
class Square : public Shape
{
public:
virtual void draw() { cout << "Square::Draw()" << endl; }
~Square() { cout << "Square::~Square()" << endl; }
};
int main()
{
vector<Shape*> vs; //元素为对象指针
vs.push_back(new Circle);
vs.push_back(new Square);
for_each(vs.begin(), vs.end(), mem_fun(&Shape::draw));
for(unsigned i=0;i<vs.size();i++)
delete vs[i];
return 0;
}
注意for_each只是通过函数对象执行每一个元素.
transform对应的函数对象不能返回void
实例代码2:
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <vector>
#include <ctime>
using namespace std;
class NumStringGen //随机生成一个string实数
{
const int sz;
public:
NumStringGen(int n=7):sz(n){}
string operator()()
{
string digit("0123456789");
string ret(sz,' ');
ret[0]=digit[rand()%9+1];//第一位不为0
for(int i=1;i<sz;i++)
{
if(sz>3&&i==sz/2) ret[i]='.';//中间插入'.'
else ret[i]=digit[rand()%10];
}
return ret;
}
};
int main()
{
srand(time(0));
const int N=10;
vector<string> vecstr(N); //保存string类型
const char* arrpc[N];//保存char*类型
vector<double> vecdou;//保存double类型
generate(vecstr.begin(),vecstr.end(),NumStringGen());
//下面的使用
transform(vecstr.begin(),vecstr.end(),arrpc,mem_fun_ref(&string::c_str));
transform(arrpc,arrpc+N,back_inserter(vecdou),atof); //atof本身就是函数对象??
ostream_iterator<double> out(cout," ");
copy(vecdou.begin(),vecdou.end(),out);
cout<<endl;
}
分享到:
相关推荐
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
构建和调整PL/SQL触发器、函数和程序包 使用Java、JDBC和XMIL开发数据库应用程序 使用Oracle实时应用群集(RAC)优化可用性和可扩展性 内容提要 《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle ...
构建和调整PL/SQL触发器、函数和程序包 使用Java、JDBC和XMIL开发数据库应用程序 使用Oracle实时应用群集(RAC)优化可用性和可扩展性 内容提要 《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
28.4.3 正文变化:通用Internet邮件 扩充 343 28.5 小结 346 第29章 网络文件系统 347 29.1 引言 347 29.2 Sun远程过程调用 347 29.3 XDR:外部数据表示 349 29.4 端口映射器 349 29.5 NFS协议 351 29.5.1 文件句柄 ...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...
10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395 10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础 404 ...
10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395 10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础 404 ...
10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395 10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础...