首頁 >後端開發 >C++ >如何在 C/C 中有效率地實現非整數值的 Switch 語句?

如何在 C/C 中有效率地實現非整數值的 Switch 語句?

Linda Hamilton
Linda Hamilton原創
2024-12-04 09:08:15192瀏覽

How Can I Efficiently Implement a Switch Statement for Non-Integer Values in C/C  ?

在C/C 中啟用非整數值

問題:

問題:

確定操作基於🎜>問題:

確定操作基於🎜>問題:
MATCH("asd")
  some c++ code
MATCH("bqr")
  ... the buffer for the match is in _buf
MATCH("zzz")
  ...  user.YOURSTUFF 
/*ELSE 
  optional
*/
ENDMATCH(xy_match)

xy_match("bqr",youruserdata);

確定操作基於🎜>問題:

確定操作基於🎜>問題:

#include <utility>
#include <algorithm>
#include <initializer_list>

template <typename KeyType, typename FunPtrType, typename Comp>
void Switch(const KeyType &amp;value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws, Comp comp) {
  // ... search and invoke code
}

Switch("ger",{ 
    {"asdf",[]{ printf("0\n"); }},
    {"bde",[]{ printf("1\n"); }},
    {"ger",[]{ printf("2\n"); }}
  },[](const char *a,const char *b){ return strcmp(a,b)<0;});

確定操作基於🎜>問題:

確定操作基於非POD 常數元素(例如字串)需要諸如嵌套之類的解決方法ifs,這可能效率低且複雜。 switch 語句是為整數值設計的,不直接支援非整數。

解決方案 1:宏和模板魔法(fastmatch.h)

使用巨集和模板,可以在編譯時建立展開的二分搜尋。語法簡潔,但需要排序的 case 分支。此方法產生一個帶有隱式中斷的函數,該函數將相關匹配分配給緩衝區。 解決方案 2:C 11 Lambda 和初始化清單在 C 11 中、lambda 和初始化清單提供了更清晰的解決方案。此方法對鍵值對列表執行二分搜索,其中鍵對應於非整數值,值是函數指標。然後呼叫找到的函數。 解3:編譯時Trie (cttrie)在C 11 中,編譯時trie 方法可以處理未排序的毫不費力地進行案例分支。高階元程式設計技術在編譯時產生搜尋特里樹,利用每個特里樹節點中的 switch 語句來有效地重新導向執行流程。 完整的實作可在 github 上找到:smilethax/cttrie。

以上是如何在 C/C 中有效率地實現非整數值的 Switch 語句?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn