在 C 中实现非整数常量的 Switch 语句:使用模板和宏展开二分搜索
C 中的经典 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 算法来搜索正确的情况。
2016 年更新:未排序案例的编译时特里树
对于未排序的案例分支,更高级的解决方案利用编译时C 11 元编程中的 trie 生成。该实现可在 GitHub 上的 cttrie 库中找到。
通过利用编译器的高级代码生成器,此方法显着优化了搜索过程,提供与需要整数作为输入的 switch 语句相当的性能。
以上是如何在 C 语言中针对非整数常量高效实现 Switch 语句?的详细内容。更多信息请关注PHP中文网其他相关文章!