C++ 如何创建查找表
基本上,我只意识到我编写项目的方式需要实现某种形式的查找表,现在我以前从未这样做过,因此不知道如何做,谷歌也没有给出明确的指示C++ 如何创建查找表,c++,class,lookup-tables,C++,Class,Lookup Tables,基本上,我只意识到我编写项目的方式需要实现某种形式的查找表,现在我以前从未这样做过,因此不知道如何做,谷歌也没有给出明确的指示 我需要查找表,以便用户可以在命令行中输入函数,然后将参数传递给该函数,但不知道从何处开始我不知道您的具体要求,但我可以想象这样的情况: 你可能想调查一下。您可以创建自己的结构,其中包含: 函数名 指向该函数的指针 变量的向量(例如,从或写你的)来保存参数 验证函数以查看参数和函数指针是否匹配 为用户可以调用的每个函数创建此结构的实例。向用户显示这些内容,并让用户选择。在
我需要查找表,以便用户可以在命令行中输入函数,然后将参数传递给该函数,但不知道从何处开始我不知道您的具体要求,但我可以想象这样的情况: 你可能想调查一下。您可以创建自己的结构,其中包含:
为用户可以调用的每个函数创建此结构的实例。向用户显示这些内容,并让用户选择。在第二步中,让他输入参数值。我不知道您的具体要求,但我可以想象这样的情况: 你可能想调查一下。您可以创建自己的结构,其中包含:
为用户可以调用的每个函数创建此结构的实例。向用户显示这些内容,并让用户选择。在第二步中,让他输入参数值。您可以这样做,以创建查找(分派)表:
(注意:这是如何实现一个调度表,它是C和C++的可比性。在C++中,有其他方法,也可能更简单,不需要重新创建轮子,比如使用一些容器等)。
#包括
使用名称空间std;
//数组从0开始。
//这是用来编写代码的
//可读性原因。
#定义案例(X)X-1
typedef void(*chooseCase)();
//用于执行每个案例的函数。
//在这里,我只是在打印
//不同的字符串。
无效案例1(){
cout您可以这样做以创建查找(分派)表:
(注意:这是如何实现一个调度表,它是C和C++的可比性。在C++中,有其他方法,也可能更简单,不需要重新创建轮子,比如使用一些容器等)。
#包括
使用名称空间std;
//数组从0开始。
//这是用来编写代码的
//可读性原因。
#定义案例(X)X-1
typedef void(*chooseCase)();
//用于执行每个案例的函数。
//在这里,我只是在打印
//不同的字符串。
无效案例1(){
cout您可以使用std::map
其中functype
是typedef
'd函数指针,甚至是boost::function
类型
std::map<std::string, functype> funcs;
void call_user_func(const std::string &user_input, const std::string &arg1, const std::string & arg2)
{
functype f = funcs.at(user_input);
f(arg1, arg2);
}
std::map funcs;
无效调用用户函数(常量std::string和用户输入,常量std::string和arg1,常量std::string和arg2)
{
functype f=funcs.at(用户输入);
f(arg1,arg2);
}
您可以使用std::map
其中functype
是typedef
'd函数指针,甚至是boost::function
类型
std::map<std::string, functype> funcs;
void call_user_func(const std::string &user_input, const std::string &arg1, const std::string & arg2)
{
functype f = funcs.at(user_input);
f(arg1, arg2);
}
std::map funcs;
无效调用用户函数(常量std::string和用户输入,常量std::string和arg1,常量std::string和arg2)
{
functype f=funcs.at(用户输入);
f(arg1,arg2);
}
我给你举了一个关于Arduino的例子,这个例子几乎与C/C++代码相似
float cosLUT[(int) (360.0 * 1 / 0.5)] ;
const float DEG2RAD = 180 / PI ;
const float cosinePrecision = 0.5;
const int cosinePeriod = (int) (360.0 * 1 / cosinePrecision);
void setup()
{
initCosineLUT();
}
void loop()
{
// nothing for now!
}
void initCosineLUT(){
for (int i = 0 ; i < cosinePeriod ; i++)
{
cosLUT[i] = (float) cos(i * DEG2RAD * cosinePrecision);
}
}
float cosLUT[(int)(360.0*1/0.5)];
恒浮点数DEG2RAD=180/PI;
常数浮点余弦精度=0.5;
常数int余弦=(int)(360.0*1/余弦精度);
无效设置()
{
initCosineLUT();
}
void循环()
{
//现在没有!
}
void initCosineLUT(){
对于(int i=0;i<余弦周期;i++)
{
cosLUT[i]=(浮点)cos(i*DEG2RAD*cosneprecision);
}
}
查找表是编程领域中最强大的技巧之一。
它们是包含预先计算的值的数组,因此取代了繁重的运行时数据
通过更简单的数组索引操作进行计算
通过读取来自一系列距离的距离来跟踪某物的位置
传感器。你需要进行三角运算,可能还有功率计算。
因为它们会耗费处理器的时间,所以它会更智能、更安全
使用数组内容读取而不是那些计算更便宜。这是通常的做法
关于查找表的使用说明。我给您介绍了Arduino上的示例,该示例几乎与C/C++代码相似
float cosLUT[(int) (360.0 * 1 / 0.5)] ;
const float DEG2RAD = 180 / PI ;
const float cosinePrecision = 0.5;
const int cosinePeriod = (int) (360.0 * 1 / cosinePrecision);
void setup()
{
initCosineLUT();
}
void loop()
{
// nothing for now!
}
void initCosineLUT(){
for (int i = 0 ; i < cosinePeriod ; i++)
{
cosLUT[i] = (float) cos(i * DEG2RAD * cosinePrecision);
}
}
float cosLUT[(int)(360.0*1/0.5)];
恒浮点数DEG2RAD=180/PI;
常数浮点余弦精度=0.5;
常数int余弦=(int)(360.0*1/余弦精度);
无效设置()
{
initCosineLUT();
}
void循环()
{
//现在没有!
}
void initCosineLUT(){
对于(int i=0;i<余弦周期;i++)
{
cosLUT[i]=(浮点)cos(i*DEG2RAD*cosneprecision);
}
}
查找表是编程领域中最强大的技巧之一。
它们是包含预先计算的值的数组,因此取代了繁重的运行时数据
通过更简单的数组索引操作进行计算
通过读取来自一系列距离的距离来跟踪某物的位置
传感器。你需要进行三角运算,可能还有功率计算。
因为它们会耗费处理器的时间,所以它会更智能、更安全
使用数组内容读取而不是那些计算更便宜。这是通常的做法
使用查找表的例子。因为你使用C++,我希望在那里可以直接使用一些容器类型。可能的话,你可以定义你自己的结构,包含查找关键字的空间,以及键所代表的任何内容;创建一个这种结构类型的数组,并填充ARR。然后,当您读入输入时,您就可以使用它的键/值映射