C/C 中的 switch 语句是一种强大的控制流机制,允许基于整数值进行高效分支。然而,通常需要切换非整数值,例如字符串或枚举。这提出了一个挑战,因为 switch 语句仅接受整数参数。
处理非整数 switch 参数的一种传统方法是使用一系列 if 语句:
if( str == "foo" ) ... else if( str == "bar" ) ... else ...
但是,这种方法效率低下,因为它需要 n 种情况的线性时间复杂度 (O(n))。更有效的解决方案是使用映射或嵌套 if 将非整数值表示为整数。然而,这些方法可能很复杂且容易出错。
使用宏,可以在编译时实现展开的二分搜索,从而实现快速和语法-友好的方法:
#define NEWMATCH #define MATCH("asd") some c++ code #define MATCH("bqr") ... the buffer for the match is in _buf #define MATCH("zzz") ... user.YOURSTUFF #define ENDMATCH(xy_match)
该宏将生成一个函数,该函数以字符串作为输入并返回布尔值,通过以下方式实现二分搜索
在 C 11 中,lambda 和初始化列表提供了一种更优雅和简洁的方法:
template<typename KeyType, typename FunPtrType> void switchStatement(const KeyType& value, std::initializer_list<std::pair<const KeyType, FunPtrType>> sws) { std::lower_bound(sws.begin(), sws.end(), value, [&](const auto& a, const auto& b) { return a.first < b.first; }); if (r != sws.end() && !cmp(val, *r)) { r->second(); } // else: not found }
int main() { switchStatement<const char*, void(*())>("ger", { { "asdf", []{ printf("0\n"); } }, { "bde", []{ printf("1\n"); } }, { "ger", []{ printf("2\n"); } }, }); return 0; }
在现代 C 中,C 11 元编程技术可用于创建编译时 trie,这是一种高级数据结构,可以有效处理未排序的 case 分支:
#include <smile/cttrie/cttrie.h> using namespace smile::cttrie; // Define cases as string literals trie<true, void()> s = {"foo", "bar"}; int main() { // Switch on a string s.switch_on("foo", []() { std::cout << "foo" << std::endl; }); return 0; }
以上是如何在 C/C 中高效地实现带有非整数参数的 Switch 语句?的详细内容。更多信息请关注PHP中文网其他相关文章!