表驱动例子
如下代码
#include <iostream>
using namespace std;
int main()
{
char x = 'A';
int y;
if(x == 'A') y = 100;
else if(x == 'B') y = 80;
else if(x == 'C') y = 60;
else if(x == 'D') y = 0;
cout<<y;
return 0;
}
改为表驱动
#include <iostream>
#include <map>
using namespace std;
map<char,int> mapping;
int main()
{
mapping['A'] = 100;
mapping['B'] = 80;
mapping['C'] = 60;
mapping['D'] = 10;
char x = 'A';
int y = mapping[x];
cout<<y;
return 0;
}
可见表驱动分离了逻辑和数据。当分支判断更多时,表驱动就会显得很简洁。
一般格式:
map<条件类型,结果类型(可以是函数指针)> mapping;
mapping[条件1] = 结果1;
mapping[条件2] = 结果2;
mapping[条件3] = 结果3;
//...
mapping[条件n] = 结果n;
//...
结果类型 实际结果 = mapping[实际条件];
//mapping[实际条件](实际参数列表);
表驱动优缺点
优点
分离了逻辑和数据,代码更直观
便于添加新的条件-结果映射
缺点
存在大量查表、填表操作,效率变低
在条件-结果映射的逻辑不唯一的情况下难以编写(即逻辑不灵活)
用表维护条件-结果映射,占用大量内存
表驱动适用情况
逻辑单一
时间空间要求不高
条件-结果映射量大