c++

if-else与switch的选择

Posted by SlothSimon's Skytree on September 28, 2016

参考资料:

总结:

code 适用场景 搜索方法
if-else 对于概率不同的条件,按从大到小的概率排列提高效率;适合条件数目<=5;适用于一切类型 顺序
switch 无法确定概率优先的条件;可读性好;适合条件数目<=5;仅适用于int、char、enum class等类型 二分法或跳转表
(unordered) map 简洁;适合条件数目>5;适用于一切类型 (hash)红黑树

表虽然这么列了,其实还有很多tricky的细节,比如有的编译器对于类似switch的if-else也会优化搜索,所以99.99%(或者说100%...)情况下根本不用考虑二者的效率区别,哪个写起来可读性好或者维护性好就可以了。优化这二者的工作应该由编译器完成。

除此之外,也要考虑具体的应用场景。

考虑用switch还是if-else是我写游戏状态机时遇到的问题,因为if-else虽然可以满足跳转条件,但是读起来实在没有switch那么一目了然,还要重复写v == 1, v == 2, ……

而switch的缺点呢,则是不能用string作判断条件,这就很蛋疼了,因为我用的是cocos2d的CustomEventName作为参数传递的。

对格式强迫症的我,最后还是选了switch,为此特地写了enum与string之间的相互转换,结果还是会用到map和数组。关于 enum的话题又可以另外写一篇日志了。

也许将来会换成map<string, void*>吧,然后把函数指针存在里面进行调用。