![]() |
1
56
使用一些讨厌的宏和模板魔术,可以在compiletime上使用漂亮的语法进行展开的二进制搜索——但是匹配(“case”)必须是 已排序 : fastmatch.h
这将(大致)生成一个函数
以及
更新C++ 11:Lambdas和初始化器列表使事情变得更漂亮(不涉及宏!):
就是这个主意。在这里可以找到更完整的实现: switch.hpp . 2016年更新:编译时trie我对这个问题的最新看法是使用高级c++11元编程来 生成 search-trie 在编译时。 与前面的方法不同,这将处理 未排序 大小写分支/字符串很好;它们只能是字符串文本。 G++也允许constexpr,但不允许clang(从HEAD 3.9.0/trunk 274233开始)。 在每个trie节点中,switch语句用于利用编译器的高级代码生成器。 github提供了完整的实现: smilingthax/cttrie . |
![]() |
2
29
在C++中,你可以获得
就我个人而言,我总是觉得ELSEIF链更具可读性。 |
![]() |
3
15
您可以不使用任何地图或下面这样的无序地图来实现它。 单独比较第一个字符以确定哪个字符串。 如果有多个匹配项,则可以在该case语句中回退到If/else链。 如果没有多个字符串以同一个字母开头,则比较的次数将大大减少。
这看起来是没有任何成本的最佳解决方案,即使它不是标准的。 |
![]() |
4
10
使用
其他一切都需要额外的代码,比如说增加复杂性。它只是把丑恶转移到别的地方。但在某种程度上,字符串比较仍然必须发生。现在你已经用更多的代码覆盖了它。
你
可以
通过使用map或hash map可以获得一些性能提升,但是您也可以通过简单地选择一个智能顺序来评估
|
![]() |
5
5
在C语言中,有两种常见的解决方案。第一种方法是将关键字保存在排序数组中,比如
然后做一个 binary search 在他们身上。前面的代码直接来自 awk 由C大师布莱恩W.科尼根。 另一个解决方案是 O型 (最小值( 米 , n个 ))如果 n个 是输入字符串的长度,并且 米 最长关键字的长度,是使用有限状态解,如Lex程序。 |
![]() |
6
4
像这样的事情太复杂了?
|
|
7
4
这在精神上类似于lambda和无序映射解决方案,但我认为这是两个世界中最好的,具有非常自然和可读的语法:
开关h:
|
![]() |
8
3
下面是有效的示例代码:
这应该管用。
这将字符串视为4字节整数。 这是考虑,丑陋,不可携带,“黑客”,并不是一个好的风格。 但它做了你想做的。
在MSVC2010中测试 |
![]() |
9
1
我想到了一个基于元编程的散列生成器,您可以使用它 like in this example . 这是针对C++ 0x的,但是我相信你可以像标准C++一样复制它。 |
![]() |
10
1
你还是可以换个开关。。如果你事先知道标签的话。。(这是相当讨厌的(即没有检查,但只要有一个有效的以空结尾的字符串,添加检查应该很简单!),我可以想象这比大多数选项执行得更快?
当然,如果你有一个非常大的“标签”列表,这将变得相当复杂。。。 |
![]() |
11
1
你可以用我的
switch macros
,它支持所有类型的值。在一些情况下,使用
|
![]() |
12
1
你可以用任何类型的信用证++ switch implementation . 你的代码如下:
例如,可以使用更复杂的类型
特征
语言转换的最大差异是
为了
阅读 more about 这个开关实现。 |
![]() |
13
1
LLVM有
这里的主要胜利在于没有散列冲突带来的问题:不管怎样,在接受一个案例之前,总是要比较实际的字符串。 |
![]() |
14
0
请注意,即使允许,const char*的切换也不会按预期工作。 C字符串实际上是指向char的指针。像你建议的代码:
如果我们的语言是一致的
比较指针值
,而不是实际的字符串内容。比较字符串需要
所以不要对C/C++感到不好,因为它不被支持。:)
我推荐带map的O(logn)解决方案
|
![]() |
15
0
不久前,我编写了一个模板类,实现了某种等价的开关,可以在 任何数据类型 . 但是,有一些限制其应用领域的限制:
例如,您希望打开类型为
基本上,它包装了一个std::map容器,保存pair值/函数。它还可以处理“默认”,这使得切换非常有趣。它很容易适应其他情况。代码如下:
其他细节 are here . |
![]() |
16
0
奋力争取胜利您可以使用编译时哈希函数,就像在这个光荣的堆栈溢出中一样 answer . 如果创建函数
你准备好了。若要处理密钥字符串和大小写字符串的crc的错误匹配,需要包含对匹配的显式检查。这不会真正影响性能,因为这只是一次检查,但它使它更难看,宏版本看起来更好。 我发现这两根绳子 same CRC32 .
没有宏
使用宏
全面实施[ gist ]
|
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 7 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 8 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 8 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 8 月前 |