最初接触函数指针,在算法书(C++ 数据结构与算法4th Adam Drozdek著)的第一章上看到一个用函数指针求定积分的例子
[C++] 函数指针- 目录
1.函数指针是什么
对于一个简单的函数 ,C++编程会写成:
double f(double x) {
return x*x - 2*x - 3;
}
对于上面这个函数,在C++中,函数名可以类比数组名
数组名指向数组首地址,函数名也一样,函数名指向这个函数自己
数组名我们会认为是对应数组类型的指针,函数名也就是对应函数类型的指针
可以 参考博客: typedef 来定义一个函数类型的指针或者是函数类型本身
即f是指向f()的指针,*f是函数本身,(*f)(0.5)调用了函数f,通常调用写为f(0.5)
python绘制图像:
import matplotlib.pylab as plt
import numpy as np
def f(x):
return x*x - 2*x - 3
if __name__ == "__main__":
x = np.arange(-5, 5, 0.1)
y = f(x)
plt.plot(x, y)
plt.ylim(-4.5, +5)
plt.show()
得到图像:
现在考虑求[0, 2.5]积分:
不使用牛顿公式,也不用定义法求和取极限,使用C++怎么解决呢?
现在条件是函数f(x)的C++实现,积分区域,输出是f(x)在积分区域上的定积分
2.函数指针的用法
上面出现了一个需求,求定积分,按照无限分割的思想,将这样的面积分成无数小的矩形(正负面积均有),求和
delta 取得越小越接近准确值
比如取delta = 0.01
double definite_integrals() {
double delta = 0.01;
double count = 0.0;
double result = 0.0;
while (count <= 2.5) {
result += f(count);
count += delta;
}
return result;
}
这样看来,似乎不需要函数指针,直接调用就可以了?
但这样的耦合性很差,函数本身也是一种处理规则,C++中函数本身不能作为参数传入
但是可以将函数的指针作为参数传入:
double definite_integrals(double (*p_func) (double), double delta, double low, double high) {
double count = low, result = 0.0;
while (count <= high) {
result += delta * p_func(count);
count += delta;
}
return result;
}
输出结果:
delta = 0.01 low = 0.0 high = 2.5
delta = 0.001 low = 0.0 high = 2.5
delta = 0.0001 low = 0.0 high = 2.5
此时和标准答案
已经非常接近,收工
3.Demo
3.1 Github
3.2 Gitee
4.尾记
4.1 stringstream 流清空
写本文章的时候遇到了stringstream的数据流清空的问题,经过仔细的gdb调试,发现只有
ss.clear();
可以得到正确结果
ss.flush();
ss.str("");
网上盛传的两种“正确清空”的方法得到的结果均错的离谱
4.2 gdb带参数调试
进入gdb之后按照以下格式设置参数
set args [arg1 [, arg2 [, arg3 [, ...]]]]
例如正常运行上面这个Demo,应该使用:
./a.out 0.00001 0 2.5
那么gdb调试的时候,就输入:
set args 0.00001 0 2.5