通过hash_map<字符串 fnPtr>调用函数指针是否比C++中的多个 if/else if/else 语句更有效或更好?
Is a calling a function pointer through a hash_map<string, fnPtr> more efficient or better style than multiple if/else if/else statements in C++?
我本来打算做一个switch
声明,但后来意识到它不能对string
做。于是我写了一个if
/else if
/else
语句,然后我意识到我不应该把我的函数写得这么长。因此,我打算将函数调用放在每个级联if
块的主体内,并认为使用hash_map
/unordered_map
对一组函数指针可能会更好。
我的问题是:
-
使用hash_map指向要使用的函数并以这种方式调用它会更有效吗?
IIRC,映射应该接近O(1),而作为级联if需要一直向下测试,直到找到匹配,因此是O(N)。然而,在什么情况下(什么N),使用带有字符串键的映射,O(1)超越了O(N)的特性?
-
是更好的编码风格?
由于我正在减少将特定代码封装为特定于需要完成的操作的更小的函数,我认为这将是正确的。我知道这更像是一个意见问题,但作为一个社区,我认为这仍然是一个有效的问题。
-
取决于很多事情——你的表有多大,分支预测器中缓存缺失对性能的影响有多严重,你能先优化多少最常见的情况,你的哈希函数有多密集,这些哈希是否被缓存,你得到了多少冲突,以及你如何重新映射这些冲突。它将趋向于哈希,但在某些情况下可能不是。
-
地图更干净了。它更容易理解,你不会让某人决定在if语句中的15个分支中的1个分支中抛出特殊情况逻辑,然后在调试和维护中丢失。
使用hash_map指向要使用的函数并以这种方式调用它会更有效吗?
我不认为效率会成为任何一种方法的问题,除非你计划有大量的字符串/函数指针(在这种情况下,你的建议是只有可行的选择)。
是更好的编码风格?
我想这么说。它看起来干净多了,而且很容易理解。
相关文章:
- 在 C++ 中的 if-else if- else 语句期间更改变量
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 我需要把 constexpr 放在 else-if 之后吗?
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 如何在 C++17 中将 "else-if" 与初始值设定项一起使用?
- if, else if, else 函数未准确显示结果
- 使用 if/else if 的函数输出问题
- 需要消除这些"else if"并优化代码
- 不必要的 else 语句:当可以使用 IF 时,使用 ELSE IF 有什么缺点吗?
- MQL4:我的if/else if liop只有一半导致当前执行
- 如何在 else-if 语句中正确使用 or 语句 (||)
- if else-if else 语句 c++ 的替代项
- 具有"else if"方法问题 C++ 的基本计算器
- 如果/else-if语句将如何处理此操作
- If和else-If语句.它是如何在下面的代码中工作的
- 优化代码/实现"for"循环而不是长"if - else if - else"
- "if"块没有大括号,使后续"else if"嵌套
- 试图编写一个只使用if和else-if语句对两个数字进行排序的程序
- if else-if梯形图和编译器优化
- C++在else/if中声明一个优先级队列