函数指针作为参数&回调函数

与c#和java不许使用指针不同,在c/c++中,允许把函数当做指针作为参数被其他函数调用。而这个作为指针被调用的函数称作回调函数。

现在我们设计一个函数,接受两个参数,第一个参数是一个数组;第二个数组是一个函数指针,将调用这个函数实现对数组的每个元素操作,具体什么操作要看我们怎么定义这个指针函数了。

vector<int> map(const vector<int> &v,int (*f)(int n))
{
    vector<int> res(v.size(),0);
    for(unsigned int i=0;i<v.size();i++)
    {
        res[i]=f(v[i]);
    }

    return res;
}

这个函数的原型定义大致意思就是讲一个数组映射成另外一个数组,数组元素的映射(map)就要看指针函数f怎么定义了。

下面定义两个函数供上面定义的函数使用:

int func(int n)
{
    return n*n;
}

int func2(int n)
{
    return n*n*n;
}

当map调用func时:

    vector<int> test_vector{1,2,3,4,5};
    vector<int> re1=n2(test_vector,func);

re1将会 得到{1,4,9,16,25}。

当map调用func2时:

    vector<int> test_vector{1,2,3,4,5};
    vector<int> re2=n2(test_vector,func2);

re2得到{1,8,27,64,125}

由此可以看出,我们若想修改映射规则时,只需要规定函数指针f所指向的函数就行了。

下面是完整测试程序:

#include <vector>
#include <iostream>
using namespace std;

vector<int> n2(const vector<int> &v,int (*f)(int n))
{
    vector<int> res(v.size(),0);
    for(unsigned int i=0;i<v.size();i++)
    {
        res[i]=f(v[i]);
    }

    return res;
}

// you can custom your function
int func(int n)
{
    return n*n;
}

int func2(int n)
{
    return n*n*n;
}

ostream &operator <<(ostream &o,vector<int> &v)
{
    for(auto e:v)
    {
        o<<e<<" ";
    }
    return o;
}

int main()
{
    vector<int> test_vector{1,2,3,4,5};
    cout<<test_vector<<endl;
    vector<int> re1=n2(test_vector,func);
    vector<int> re2=n2(test_vector,func2);
    cout<<re1<<endl;
    cout<<re2<<endl;
    cout<<"hello world"<<endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值