亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 619 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號