if-else VS地图查找

时间:2019-11-18 08:26:35

标签: c++ performance data-structures

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更好吗?

1 个答案:

答案 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