`
kmplayer
  • 浏览: 508707 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通用算法之可调整的函数对象

阅读更多
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算法程序的设计与实现,该程序具有良好的可扩展性和灵活性,能够适应不同规模的神经网络模型训练。通过对BP算法原理的深入理解和程序的具体实现,可以帮助研究人员和工程师更高效...

    阈值化OTSU算法cvAdaptiveThreshold 函数

    例如,对于一幅背景复杂且有噪声干扰的图像,传统阈值化方法可能需要多次尝试才能确定一个合适的全局阈值,而使用cvAdaptiveThreshold函数则可以在不同区域自动调整阈值,更好地适应图像的局部特性。这样处理后的...

    A*算法最短路径万能通用matlab代码

    在实际应用中,要确保MATLAB代码的可读性和灵活性,以便适应不同的问题实例,例如动态调整启发式函数、处理障碍物或权重图等。此外,对于大型图,还需要考虑内存效率和运行时间优化,例如使用增量式更新、剪枝策略等...

    C++精选代码库。包含常用STL容器模拟实现、algorithm算法头文件函数demo

    它包含了大量可用于任何类型的可迭代对象的通用算法,例如: 1. **排序算法**:`std::sort`用于对范围内的元素进行排序,而`std::stable_sort`保证了稳定性。 2. **查找算法**:`std::find`寻找指定元素的第一个...

    标准PSO算法程序

    3. **C++实现**:C++是一种通用、面向对象的编程语言,具有高效、灵活的特点,适合编写这种计算密集型的优化算法。程序可能包含类定义(如`Particle`类,表示粒子)、函数实现(如`updatePosition`和`updateVelocity...

    mpi通用函数介绍

    ### MPI通用函数详解 MPI(Message Passing Interface,消息传递接口)是一种用于编写并行程序的标准,主要用于分布式内存架构上的并行编程。以下是对给定文件中提到的几个关键MPI函数的详细解析,这些函数对于初学...

    mean_shift算法MATLAB代码

    9. `object_tracking.m`:通用的对象追踪函数,可以适用于多种情况。 总的来说,这个MATLAB代码集提供了完整的均值平移目标跟踪解决方案,不仅实现了基本的均值平移算法,还特别关注了在目标尺寸变化情况下的适应性...

    如何使用函数(如何使用函数如何使用函数c#)

    此外,即使在面向对象的上下文中,面向过程的思想仍然在许多细节层面发挥着重要作用,尤其是在处理低层次细节或实现特定算法时,函数的简洁性和效率不可替代。 #### 结论 综上所述,函数不仅是编程语言的基础构造...

    C++回调函数

    比如在前面提到的例子中,排序算法的实现者可以定义一个通用的排序框架,而具体的比较逻辑则由用户通过回调函数来提供。 3. **重用性**:由于回调函数允许外部代码插入到内部处理流程中,因此可以更容易地实现代码...

    基于Matlab模型算法控制工具箱的开发.pdf

    在MATLAB环境下开发模型算法控制(Model Algorithmic Control, MAC)工具箱,是为了解决MATLAB中缺乏此类控制算法的通用函数工具箱的问题。模型算法控制,又称为模型预测启发控制(Model Predictive Heuristic Control,...

    基本 人工鱼群算法 C++实现

    C++作为一种通用、面向对象的编程语言,因其高效和灵活性,常被用于实现各种算法,包括人工智能和优化算法。 在这个"基本人工鱼群算法 C++实现"中,我们可以期待以下关键知识点: 1. **人工鱼群算法原理**:每条...

    STL容器和算法函数表

    STL不仅提供容器,还有一系列通用算法,如`sort`, `find`, `copy`, `transform`等,这些算法可以作用于任何满足一定要求的序列上,极大提高了编程效率和代码的可读性。例如: - `sort`: 对容器进行排序。 - `find`: ...

    C++遗传算法示例

    在C++编程语言中实现遗传算法,可以利用其强大的面向对象特性来设计灵活且高效的算法结构。下面我们将深入探讨C++中的遗传算法实现及其相关知识点。 首先,我们需要理解遗传算法的基本步骤: 1. 初始化种群:随机...

    带权重的A*算法C++、CMake实现

    4. **带权重的A*算法**:在标准A*算法的基础上,"带权重的A*"可能指代对启发式函数或者路径成本函数进行了调整,以适应特定问题的需求。这可能涉及到了权衡不同路径特征,比如考虑地形阻力、移动速度等因素,使得...

    GA.rar_algorithm_c++遗传算法_算法_遗传算法C++_遗传算法‘

    在C++中实现遗传算法,需要理解并掌握基本的面向对象编程概念,如类、对象、继承等。C++的模板功能使得算法的通用性更强,可以方便地处理不同类型的决策变量。同时,利用STL(标准模板库)中的容器,如vector和queue...

    BP.rar_bp 函数逼近

    移植性好意味着这个BP网络模型可以方便地应用于不同的硬件平台或编程语言环境,具备较好的通用性和可扩展性。 标签"bp_函数逼近"强调了这个项目的核心技术——BP算法在函数逼近中的应用。 从压缩包子文件的文件...

    MFC计算机图形学画直线算法实现

    此外,注意MFC的设备上下文(CDC)对象,它是进行图形绘制的主要接口,提供了一系列的绘图函数,如MoveTo和LineTo,可以方便地与这些算法结合使用。 总结来说,DDA、中点和Bresenham算法在MFC中的实现都是通过对...

Global site tag (gtag.js) - Google Analytics