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;
}
分享到:
相关推荐
本文介绍了一个通用的人工神经网络BP算法程序的设计与实现,该程序具有良好的可扩展性和灵活性,能够适应不同规模的神经网络模型训练。通过对BP算法原理的深入理解和程序的具体实现,可以帮助研究人员和工程师更高效...
例如,对于一幅背景复杂且有噪声干扰的图像,传统阈值化方法可能需要多次尝试才能确定一个合适的全局阈值,而使用cvAdaptiveThreshold函数则可以在不同区域自动调整阈值,更好地适应图像的局部特性。这样处理后的...
在实际应用中,要确保MATLAB代码的可读性和灵活性,以便适应不同的问题实例,例如动态调整启发式函数、处理障碍物或权重图等。此外,对于大型图,还需要考虑内存效率和运行时间优化,例如使用增量式更新、剪枝策略等...
它包含了大量可用于任何类型的可迭代对象的通用算法,例如: 1. **排序算法**:`std::sort`用于对范围内的元素进行排序,而`std::stable_sort`保证了稳定性。 2. **查找算法**:`std::find`寻找指定元素的第一个...
3. **C++实现**:C++是一种通用、面向对象的编程语言,具有高效、灵活的特点,适合编写这种计算密集型的优化算法。程序可能包含类定义(如`Particle`类,表示粒子)、函数实现(如`updatePosition`和`updateVelocity...
### MPI通用函数详解 MPI(Message Passing Interface,消息传递接口)是一种用于编写并行程序的标准,主要用于分布式内存架构上的并行编程。以下是对给定文件中提到的几个关键MPI函数的详细解析,这些函数对于初学...
9. `object_tracking.m`:通用的对象追踪函数,可以适用于多种情况。 总的来说,这个MATLAB代码集提供了完整的均值平移目标跟踪解决方案,不仅实现了基本的均值平移算法,还特别关注了在目标尺寸变化情况下的适应性...
此外,即使在面向对象的上下文中,面向过程的思想仍然在许多细节层面发挥着重要作用,尤其是在处理低层次细节或实现特定算法时,函数的简洁性和效率不可替代。 #### 结论 综上所述,函数不仅是编程语言的基础构造...
比如在前面提到的例子中,排序算法的实现者可以定义一个通用的排序框架,而具体的比较逻辑则由用户通过回调函数来提供。 3. **重用性**:由于回调函数允许外部代码插入到内部处理流程中,因此可以更容易地实现代码...
在MATLAB环境下开发模型算法控制(Model Algorithmic Control, MAC)工具箱,是为了解决MATLAB中缺乏此类控制算法的通用函数工具箱的问题。模型算法控制,又称为模型预测启发控制(Model Predictive Heuristic Control,...
C++作为一种通用、面向对象的编程语言,因其高效和灵活性,常被用于实现各种算法,包括人工智能和优化算法。 在这个"基本人工鱼群算法 C++实现"中,我们可以期待以下关键知识点: 1. **人工鱼群算法原理**:每条...
STL不仅提供容器,还有一系列通用算法,如`sort`, `find`, `copy`, `transform`等,这些算法可以作用于任何满足一定要求的序列上,极大提高了编程效率和代码的可读性。例如: - `sort`: 对容器进行排序。 - `find`: ...
在C++编程语言中实现遗传算法,可以利用其强大的面向对象特性来设计灵活且高效的算法结构。下面我们将深入探讨C++中的遗传算法实现及其相关知识点。 首先,我们需要理解遗传算法的基本步骤: 1. 初始化种群:随机...
4. **带权重的A*算法**:在标准A*算法的基础上,"带权重的A*"可能指代对启发式函数或者路径成本函数进行了调整,以适应特定问题的需求。这可能涉及到了权衡不同路径特征,比如考虑地形阻力、移动速度等因素,使得...
在C++中实现遗传算法,需要理解并掌握基本的面向对象编程概念,如类、对象、继承等。C++的模板功能使得算法的通用性更强,可以方便地处理不同类型的决策变量。同时,利用STL(标准模板库)中的容器,如vector和queue...
移植性好意味着这个BP网络模型可以方便地应用于不同的硬件平台或编程语言环境,具备较好的通用性和可扩展性。 标签"bp_函数逼近"强调了这个项目的核心技术——BP算法在函数逼近中的应用。 从压缩包子文件的文件...
此外,注意MFC的设备上下文(CDC)对象,它是进行图形绘制的主要接口,提供了一系列的绘图函数,如MoveTo和LineTo,可以方便地与这些算法结合使用。 总结来说,DDA、中点和Bresenham算法在MFC中的实现都是通过对...