下面这段代码怎么优化const string FUNC1 = "func1"; const string FUNC2 = "func2"; const string FUNC3 = "func3"; int func1(int a, int b) { return a + b; } float func2(int a, float b, float c) { return float(a) + b + c; } int func3(int a, const char *b) { int result = a; auto length = strlen(b); for (size_t i = 0; i < length; i++) { result += b[i] - '0'; } return result; } map<string, function<any(vector<any>)>> funcMap = { {FUNC1, [](vector<any> args) { return func1(any_cast<int>(args[0]), any_cast<int>(args[1])); }}, {FUNC2, [](vector<any> args) { return func2(any_cast<int>(args[0]), any_cast<float>(args[1]), any_cast<float>(args[2])); }}, {FUNC3, [](vector<any> args) { return func3(any_cast<int>(args[0]), any_cast<char *>(args[1])); }} }; int funAll(const string &key, const vector<any> args) { if (funcMap.find(key) == funcMap.end()) { return -1; } auto func = funcMap[key]; auto result = func(args); cout << any_cast<float>(result) << endl; return 0; }
时间: 2023-06-18 13:06:38 浏览: 75
可以将const string常量改为constexpr常量,这样可以在编译时进行计算,提高程序运行时的效率。
另外,可以将函数参数的类型限制更准确,比如将func3中的const char *改为const string &,这样可以避免不必要的字符数组转换和拷贝。
最后,可以考虑引入模板,使函数可以接受任意类型的参数,进一步提高代码的复用性和灵活性。
相关问题
针对下面这段代码,怎么优化map表和funAll函数const string FUNC1 = "func1"; const string FUNC2 = "func2"; const string FUNC3 = "func3"; int func1(int a, int b) { return a + b; } float func2(int a, float b, float c) { return float(a) + b + c; } int func3(int a, const char *b) { int result = a; auto length = strlen(b); for (size_t i = 0; i < length; i++) { result += b[i] - '0'; } return result; } map<string, function<any(vector<any>)>> funcMap = { {FUNC1, [](vector<any> args) { return func1(any_cast<int>(args[0]), any_cast<int>(args[1])); }}, {FUNC2, [](vector<any> args) { return func2(any_cast<int>(args[0]), any_cast<float>(args[1]), any_cast<float>(args[2])); }}, {FUNC3, [](vector<any> args) { return func3(any_cast<int>(args[0]), any_cast<char *>(args[1])); }} }; int funAll(const string &key, const vector<any> args) { if (funcMap.find(key) == funcMap.end()) { return -1; } auto func = funcMap[key]; auto result = func(args); cout << any_cast<float>(result) << endl; return 0; }
函数名, vector<any> args)
{
auto func = funcMap.find(funcName);
if (func != funcMap.end())
{
return any_cast<int>((func->second)(args));
}
return 0;
}
针对这个问题,可以进行以下优化:
1.修改map表:可以使用unordered_map代替map,因为unordered_map使用哈希表,可以快速查找元素,而map使用红黑树,查找元素比较慢。
2.修改函数定义:可以将函数返回值类型设置为auto,让编译器自动推导返回值类型。
3.修改funAll函数:可以使用auto关键字来自动推导func的类型,以及使用const引用参数来避免不必要的复制。同时可以将if语句中的find()和end()合并为一个语句,提高代码的可读性和效率。
优化后的代码如下:
const string FUNC1 = "func1";
const string FUNC2 = "func2";
const string FUNC3 = "func3";
auto func1(int a, int b) {
return a + b;
}
auto func2(int a, float b, float c) {
return float(a) + b + c;
}
auto func3(int a, const char* b) {
int result = a;
auto length = strlen(b);
for (size_t i = 0; i < length; i++) {
result += b[i] - '0';
}
return result;
}
unordered_map<string, function<any(vector<any>&)>> funcMap = {
{FUNC1, [](vector<any>& args) { return func1(any_cast<int>(args[0]), any_cast<int>(args[1])); }},
{FUNC2, [](vector<any>& args) { return func2(any_cast<int>(args[0]), any_cast<float>(args[1]), any_cast<float>(args[2])); }},
{FUNC3, [](vector<any>& args) { return func3(any_cast<int>(args[0]), any_cast<const char*>(args[1])); }}
};
int funAll(const string& funcName, vector<any>& args) {
auto func = funcMap.find(funcName);
if (func != funcMap.end()) {
return any_cast<int>((func->second)(args));
}
return 0;
}
type Shape string const ( Triangle Shape = "TRIANGLE" Circle Shape = "CIRCLE" ) // Values provides list valid values for Enum. func (Shape) Values() (kinds []string) { for _, s := range []Shape{Triangle, Circle} { kinds = append(kinds, string(s)) } return什么意思 一段一段解释
这段代码定义了一个名为Shape的枚举类型,其中包含Triangle和Circle两个常量。
Values是Shape类型的方法,它返回一个字符串切片,其中包含了所有枚举值的字符串表示。
具体来说,此方法使用一个for循环遍历所有Shape值,并将它们的字符串表示追加到一个字符串切片中。最后,它返回该切片。
因此,调用Shape.Values()将返回一个包含"TRIANGLE"和"CIRCLE"的字符串切片。这个方法通常用于将枚举值的所有可能字符串表示列出来,例如在API文档中提供合法的输入值。
阅读全文