猿问

C / C ++:非整数开关

通常,我需要根据非POD常量元素的值来选择要执行的操作,如下所示:


switch( str ) {

  case "foo": ...

  case "bar": ...

  default:    ...

}

遗憾的是switch只能与整数一起使用:error: switch quantity not an integer。


那么,实现这种事情的最简单的方法就是拥有ifs 序列:


if( str == "foo" )      ...

else if( str == "bar" ) ...

else                    ...

但是这种解决方案看起来很脏,应该花费O(n),其中n是案例数,而在最坏的情况下使用二进制搜索,那段代码可能花费O(log n)。


使用某些数据结构(例如Maps),可以获取表示字符串(O(log n))的整数,然后使用O(1)switch,或者可以通过if在右侧嵌套s 来实现静态二进制排序方式,但是这些骇客仍然需要大量的编码,这使一切变得更加复杂且难以维护。


最好的方法是什么?(如switch声明所述,快速,干净,简单)


万千封印
浏览 584回答 3
3回答

慕工程0101907

您无需使用任何地图或如下所示的unordered_map就可以实现它。仅比较第一个字符以识别哪个字符串。如果有多个匹配项,则可以回退到该case语句中的if / else链。如果没有很多以相同字母开头的字符串,则比较次数将大大减少。char *str = "foo";switch(*str){case 'f':&nbsp; &nbsp; //do something for foo&nbsp; &nbsp; cout<<"Foo";&nbsp; &nbsp; break;case 'b':&nbsp; &nbsp; //do something for bar&nbsp; &nbsp; break;case 'c':&nbsp; &nbsp; if(strcmp(str, "cat") == 0)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //do something for cat&nbsp; &nbsp; }&nbsp; &nbsp; else if(strcmp(str, "camel") == 0)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //do something for camel&nbsp; &nbsp; }}即使它不是标准的,这看起来也是最佳的解决方案,无需花费任何费用。
随时随地看视频慕课网APP
我要回答