std::string v = GetV();
if(v == "AAA") {
func1();
} else if (v == "BBB" || v == "CCC" || v == "EEE") {
func2();
} else {
func3();
}
基本上,我想像上面的代码一样进行条件处理。由于将来可能会有更多的v值,因此我认为if-else语句不够好。所以我将其替换为map
;
enum v_type {
v_type1,
v_type2,
v_type3,
v_type4
};
string v = GetV();
const static std::map < string, v_type > v_map({
"AAA",
v_type1
}, {
"BBB",
v_type2
}, {
"CCC",
v_type2
});
auto iter = v_map.find(v);
if (iter == v_map.end()) return;
switch
case (iter->second) {
case v_type1:
func1();
break;
case v_type2:
func2();
break;
}
我认为map(Olog(N))甚至unordered_map都比if-else语句中的字符串比较要快,但要权衡的可能是内存和CPU的映射本身。我对吗?使用map / unorder_map比if-else更好吗?
答案 0 :(得分:1)
您可以尝试使用std::unordered_map<std::string, std::function<void()>>
,它将字符串映射到您的函数。
这是一个示例:
#include <iostream>
#include <unordered_map>
#include <functional>
void func1() {std::cout << "Func1" << std::endl;}
void func2() {std::cout << "Func2" << std::endl;}
void func3() {std::cout << "Func3" << std::endl;}
int main()
{
std::unordered_map<std::string, std::function<void()>> myMap;
myMap["AAA"] = std::function<void()>(&func1);
myMap["BBB"] = std::function<void()>(&func2);
myMap["CCC"] = std::function<void()>(&func2);
myMap["EEE"] = std::function<void()>(&func2);
std::string v = GetV();
if (myMap.find(v) != myMap.end()) {
myMap.find(v)->second();
} else {
func3();
}
return 0;
}
您只需要定义哪个字符串对应于哪个函数,就无需使用switch/case
。