C_age.h
//在C语言时代,要将函数当做参数传递,唯有通过函数指针
//以下是用函数指针实现参数传递的示例
# include <cstdlib>
# include<iostream>
using namespace std;
int fcmp(const void *elem1, const void*elem2);
void Test()
{
int ia[10] = { 32, 92, 67, 58, 10, 4, 25, 52, 59, 54 };
for (int i = 0; i < 10; i++)
{
cout << ia[i] << " ";
}
cout << endl;
//需要给库里面的函数写控制选项,可以防止代码冗余,比如库里面实现了升序算法但是可以据此写一种策略
//实现降序算法
qsort(ia, sizeof(ia) / sizeof(int), sizeof(int), fcmp);
//记住qsort的参数形式,共有四个参数,数组指针,数组的大小,所排数类型本身的大小,排序的方法
for (int i = 0; i < 10; i++)
{
cout << ia[i] << " ";
}
}
//实现排序方法的函数
int fcmp(const void *elem1, const void *elem2)
{
const int *i1 = (const int *)elem1;
const int *i2 = (const int *)elem2;
if (*i1 < *i2)
{
return -1;
}
else if (*i1 == *i2)
{
return 0;
}
else if (*i1>*i2)
{
return 1;
}
}
//但是函数指针也有他的缺点:最重要的是他无法持有自己的状态(局部状态,local states),也无法达到组件技术中的可适配性
//——也就是无法再将某些修饰条件加诸于其上而改变其状态
//在头文件STL_age中用仿函数的方法实现实现这种策略
# include<iostream>
using namespace std;
template<class T>
struct plus1
//实际上我理解的仿函数就是用一个类或对象重载()的方式实现函数功能,因为他不是函数呀,加上()
//形式上类似于一个函数,故此命名为仿函数。
{
T operator()(const T&x, const T&y)const//这里重载了()因此plus成了一个仿函数
{
return x + y;
}
};
template<class T>
struct minus1
{
T operator()(const T&x, const T&y)const
{
return x - y;
}
};
int Test1()
{
plus1<int> plusobj;
minus1<int> minusobj;
//这样使用仿函数就像使用一般函数一样
cout << plusobj(7, 8) << endl;
cout << minusobj(7, 8) << endl;
//以下是直接产生仿函数的临时对象或者说是匿名对象(第一对小括号),并用第二对小括号调试
cout << plus1<int>()(7, 8) << endl;
cout << minus1<int>()(7, 8) << endl;
return 0;
}
//后记,刚开始验证时直接像STL上定义,plus和minus由于库中存在编译时出现变量不明确的 错误。
//变量名不明确的错误一般都是由于定义和库中相同变量名引起的。
//# include"C_age.h"
# include"STL_age.h"
int main()
{
Test1();
return 0;
}