有没有办法在C ++中构建动态切换案例。实际上,只有在运行时才知道case值,并且这些case值的数量也只在运行时才知道。我这样做的原因是我试图在运行时通过这个开关案例构建一个完美的哈希查找。所以例如,我有四个值89,94,38,54,我想要相当于下面的东西。
switch( x )
{
case 89:
return 0;
case 94:
return 1;
case 38:
return 2;
case 54;
return 3;
}
但是,这应该在运行时构建。我们当然可以使用for循环和搜索来实现哈希查找,但这比切换情况要慢。
答案 0 :(得分:4)
可悲的是,switch case只接受编译时已知常量的值。当然,如果你只是使用if和if else而不是switch,它会做你想要的就好了。
答案 1 :(得分:2)
您可以使用哈希表完成您要查找的内容。基本思路是将89, 94, 38 , 54
映射到值0, 1, 2, 3
。
然后查找
i = 38;
return hashtable[i]; //returns 2.
如果你对最大值(比如99)有一个小的上限,那么这只是一个数组。
int hashtable[100];
对于更复杂的场景,您可以使用哈希函数,或者最好使用predefined hash table.
答案 2 :(得分:2)
你需要一个叫做跳转表的东西 - 在你的情况下,在运行时构建。这基本上由一组函数对象组成,这些函数对象返回所需的值,您可以使用键索引它。
您还可以使用哈希映射,如果范围相对较小,则效率较低,但如果范围很大,则效果肯定会更好。
答案 3 :(得分:0)
不,您无法在运行时动态创建切换案例。 相反,您应该使用一些适合您需求的算法数据结构来表示您的哈希函数,并在其中进行查找。
答案 4 :(得分:0)
我建议对数组进行二进制搜索,或者如果你的域足够小,你就可以进行数组查找。
答案 5 :(得分:0)
具有线性探测的for循环不是哈希表的示例。
要做的标准事情是使用boost,stl和许多其他流行库提供的哈希类。它可能不会像开关一样快,但会比循环好得多。
答案 6 :(得分:0)
switch语句通常在编译时针对跳转表进行优化,因此无法使用。它们必须是编译时间常量。 (您可以使用模板元编程在编译阶段生成它们吗?)
答案 7 :(得分:0)
使用哈希映射。如果有更快的方法,人们会将其用作 标准地图。
还要记住,过早优化是万恶之源。
答案 8 :(得分:0)
如果你真的想要一个完美的哈希,我建议你使用类似cmph库的东西,或者自己实现它(参见this article的例子,在python中实现)