C++ if-else与地图查找

C++ if-else与地图查找,c++,performance,data-structures,C++,Performance,Data Structures,基本上,我想做条件过程,就像上面的代码一样。因为将来可能会有更多的v值,我不认为else语句是否足够好。因此,我将其替换为map std::string v = GetV(); if(v == "AAA") { func1(); } else if (v == "BBB" || v == "CCC" || v == "EEE") { func2(); } else { func3(); } enum v_类型{ v_类型1, v_类型2, v_类型3, v_类型4 };

基本上,我想做条件过程,就像上面的代码一样。因为将来可能会有更多的v值,我不认为else语句是否足够好。因此,我将其替换为
map

std::string v = GetV();
if(v == "AAA") {
    func1();
} else if (v == "BBB" || v == "CCC" || v == "EEE") {
    func2();
} else {
    func3();
}
enum v_类型{
v_类型1,
v_类型2,
v_类型3,
v_类型4
};
字符串v=GetV();
常量静态标准::映射<字符串,v_类型>v_映射({
“AAA”,
v_类型1
}, {
“BBB”,
v_类型2
}, {
“CCC”,
v_类型2
});
自动iter=v_-map.find(v);
if(iter==v_map.end())返回;
转换
案例(国际热核实验堆->第二){
案例v_类型1:
func1();
打破
案例v_类型2:
func2();
打破
}

我认为映射(Olog(N))甚至无序的_映射将比if-else语句中的字符串比较快,但折衷可能是映射本身在内存和CPU方面的速度。我说得对吗?使用map/unorder\u map是否比if-else更好?

您可以尝试使用
std::unorder\u 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;
}
#包括
#包括
#包括

void func1(){std::cout为什么不是
std::无序_map@Someprogrammerdude说到性能,我认为只有
find
真的是一个不错的选择,因为其他两种方法会强制执行双重查找…我们到底在谈论多少字符串?在超过几十个或几百个字符串之前,您可能不会真正注意到差异。在任何ca中SE,您可能首先要对程序进行配置,也许瓶颈是在完全不同的地方……考虑使用有限的一系列标签,为这些字符串导出一个完美的散列函数,然后将其用作字符串的无序映射的HASER,以<代码> STD::函数 SPD描述,使用<代码>查找< /C> >,然后结果是非端迭代器。正如Aconcagua所说:不要无缘无故地进行微优化。软件工程师在没有必要的地方优化代码是一个很大的陷阱。如果这不是性能瓶颈,就不要修复它。如果您的代码存在性能问题,Forrest将确定出现问题的地方,而不是优化您认为存在的东西nk就是问题所在。有很好的工具可以分析代码的cpu和内存使用情况。映射到函数指针比我的枚举开关案例实现要好得多。
#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;
}