在C 中實作非整數常數的Switch 語句:使用範本和巨集展開二分搜尋
C 中的經典switch 語句是以其經典switch 語句是以其經典switch 語句在基於整數值選擇操作時的效率而聞名。然而,在處理非整數常數時,僅使用整數的限制可能會帶來挑戰。
問題:緩慢而複雜的替代方案
一種方法是使用一系列 if 語句,但這可能效率低下且難以維護。使用映射等資料結構將字串映射到整數可能會帶來額外的複雜性和編碼開銷。
使用巨集和模板進行快速排序二分搜尋
為了實現快速、乾淨、簡單的實現,可以利用巨集和模板魔法。 fastmatch.h 函式庫提供了一個基於巨集的解決方案,本質上是在編譯時展開二分搜尋。語法類似 switch 語句:
NEWMATCH 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,對提供的情況執行二分搜尋。中斷是隱式的,語法已排序。
更新:C 11 Lambda 和初始化程序列表以增強優雅
在C 11 中,lambda 和初始化程序列表提供了更優雅的解決方案:
#include <utility> #include <algorithm> #include <initializer_list> template <typename KeyType, typename FunPtrType, typename Comp> void Switch(const KeyType &value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws, Comp comp) { // ... implementation omitted for brevity }
這個方法使用lambda 函數來比較值和lower_bound 演算法來搜尋正確的case。
2016 年更新:未排序用例的編譯時Trie
對於未排序的case 分支,更高階的解決方案利用編譯時C 11 元程式設計中的trie 生成。該實作可在 GitHub 上的 cttrie 庫中找到。
透過利用編譯器的高階程式碼產生器,這種方法顯著優化了搜尋過程,提供與需要整數作為輸入的 switch 語句相當的效能。
以上是如何在 C 語言中針對非整數常數高效實現 Switch 語句?的詳細內容。更多資訊請關注PHP中文網其他相關文章!