与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;
}