为了账号安全,请及时绑定邮箱和手机立即绑定

C / C ++:非整数开关

C / C ++:非整数开关

C++ C
万千封印 2019-10-09 15:29:12
通常,我需要根据非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声明所述,快速,干净,简单)
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您无需使用任何地图或如下所示的unordered_map就可以实现它。仅比较第一个字符以识别哪个字符串。如果有多个匹配项,则可以回退到该case语句中的if / else链。如果没有很多以相同字母开头的字符串,则比较次数将大大减少。


char *str = "foo";

switch(*str)

{

case 'f':

    //do something for foo

    cout<<"Foo";

    break;

case 'b':

    //do something for bar

    break;

case 'c':

    if(strcmp(str, "cat") == 0)

    {

        //do something for cat

    }

    else if(strcmp(str, "camel") == 0)

    {

        //do something for camel

    }

}

即使它不是标准的,这看起来也是最佳的解决方案,无需花费任何费用。


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 583 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信