![]() |
1
159
原因与类型系统有关。C/C++不支持字符串作为一种类型。它确实支持常量char数组的概念,但它并不完全理解字符串的概念。 为了生成switch语句的代码,编译器必须理解两个值相等意味着什么。对于像int和enum这样的项,这是一个微不足道的位比较。但是编译器应该如何比较2个字符串值呢?区分大小写、不敏感、有文化意识等…如果没有对字符串的完全了解,就无法准确地回答这个问题。 另外,C/C++转换语句通常生成为 branch tables . 为字符串样式的开关生成分支表几乎没有那么容易。 |
![]() |
2
53
如前所述,编译器喜欢构建优化的查找表
我会提供一个你可能想考虑的替代方案,我过去已经用过了,效果很好。而不是切换字符串本身,而是切换使用字符串作为输入的哈希函数的结果。如果您使用的是一组预先确定的字符串,那么您的代码几乎与切换字符串一样清晰:
有一系列明显的优化,几乎都遵循C编译器对switch语句的处理方式…真有趣。 |
![]() |
3
29
只能在int、char和enum等基元上使用switch。最简单的解决方案是使用枚举。
|
![]() |
4
12
显然不是@ MouthCoup上面的C++ 11更新 http://www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4067/Switch-on-Strings-in-C.htm 使用两个映射在字符串和类枚举之间进行转换(比普通枚举更好,因为它的值在其中有作用域,并且反向查找好的错误消息)。 编译器支持初始值设定项列表,这意味着vs 2013 plus可以在codeguru代码中使用static。GCC4.8.1可以接受,不确定它在多大程度上是兼容的。
…
|
![]() |
5
11
问题是,由于优化的原因,C++中的转换语句对原始类型的任何东西都不起作用,只能将它们与编译时常数进行比较。 可能造成这种限制的原因是编译器能够应用某种形式的优化,将代码编译为一条cmp指令和一个goto,其中地址是根据运行时参数的值计算的。由于分支和循环不能很好地与现代CPU配合使用,因此这可能是一个重要的优化。 为了解决这个问题,恐怕你不得不求助于国际单项体育联合会的声明。 |
![]() |
6
7
输出:
在方法内部使用
要在类内有效地使用此模式,请静态初始化lambda映射,否则您需要支付
在这里我们可以摆脱
必须转换lambda上下文捕获
产生与上述相同输出的示例:
|
![]() |
7
6
在C++和C开关中只对整数类型进行工作。使用if-else阶梯代替。C++显然可以为字符串实现某种SWICH语句——我想没有人认为它值得,我同意。 |
![]() |
8
6
C++ constexpr哈希函数:
|
![]() |
9
5
为什么不?你可以使用
switch implementation
具有相同的语法和语义。
这个
您的代码如下:
例如,可以使用更复杂的类型
特征
与语言切换的sintax差异是
为了
读 more about 此开关实现。 |
![]() |
10
4
我认为原因是,在C字符串中不是原始类型,正如Tomjen所说,将字符串看作char数组,因此不能执行以下操作:
|
![]() |
11
3
在C++中,只能在int和char上使用开关语句。 |
![]() |
12
3
在C++中,字符串不是第一类公民。字符串操作通过标准库完成。我想,这就是原因。此外,C++使用分支表优化来优化交换机实例语句。看看这个链接。 |
![]() |
13
3
要使用尽可能简单的容器添加变体(不需要已排序的映射)…我不必担心枚举——只需将容器定义放在开关前面,这样就可以很容易地看到哪个数字代表哪种情况。
这将在
请注意
测试未定义字符串的版本如下:
|
![]() |
14
0
不能在开关大小写中使用字符串。只允许使用in t&char。相反,您可以尝试使用枚举来表示字符串,并在开关盒块中使用它,如
在swich case语句中使用它。 |
![]() |
15
0
开关只能与整型(int、char、bool等)一起使用。为什么不使用map将字符串与数字配对,然后将该数字与开关一起使用呢? |
![]() |
16
0
|
![]() |
17
0
在许多情况下,您可以通过从字符串中提取第一个字符并打开它来完成额外的工作。如果您的案例以相同的值开始,那么可能最终不得不在charat(1)上执行嵌套切换。但是,任何阅读您的代码的人都会感激您的提示,因为大多数人会在 |
![]() |
18
0
针对交换机问题的更多功能解决方案:
|
![]() |
19
-2
这是因为C++将开关转换为跳转表。它对输入数据执行一个简单的操作,并在不进行比较的情况下跳到正确的地址。因为字符串不是一个数字,而是一个数字数组,所以C++不能从它创建一个跳转表。
(来自维基百科的代码 https://en.wikipedia.org/wiki/Branch_table ) |
![]() |
Ben · 统计向量中的单词在字符串中出现的频率 4 月前 |
![]() |
bear_525 · 从列中删除中间名和首字母,并保存在单独的列中 6 月前 |
![]() |
asdfadf · 为什么具有相同内存值的字符串和整数打印方式不同? 6 月前 |
![]() |
user764754 · 防止多行原始字符串文字中出现新行字符 6 月前 |
![]() |
Bogaso · 从列表中返回与模式匹配的元素 6 月前 |
![]() |
Jasco · 如何使用VBA提取两个相似字符之间的字符串中的单词? 6 月前 |