Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的动态开关盒+; 有一种方法可以在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; }_C++_Hash_Case_Switch Statement - Fatal编程技术网

C+中的动态开关盒+; 有一种方法可以在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; }

C+中的动态开关盒+; 有一种方法可以在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; },c++,hash,case,switch-statement,C++,Hash,Case,Switch Statement,但是,这应该在运行时构建。我们当然可以使用for循环和搜索来实现哈希查找,但这当然比switch case慢。遗憾的是,switch case只接受编译时已知常量的值。当然,如果您只使用if和if-else而不是开关,它会很好地完成您想要的任务。不,您无法在运行时动态创建开关案例。 相反,您应该使用适合您需要的算法数据结构来表示哈希函数,并在其中进行查找。我建议对数组进行二进制搜索,或者如果您的域足够小,您可以只进行数组查找。带有线性探测的for循环不是哈希表的示例 标准做法是使用boost、s

但是,这应该在运行时构建。我们当然可以使用for循环和搜索来实现哈希查找,但这当然比switch case慢。

遗憾的是,switch case只接受编译时已知常量的值。当然,如果您只使用if和if-else而不是开关,它会很好地完成您想要的任务。

不,您无法在运行时动态创建开关案例。
相反,您应该使用适合您需要的算法数据结构来表示哈希函数,并在其中进行查找。

我建议对数组进行二进制搜索,或者如果您的域足够小,您可以只进行数组查找。

带有线性探测的for循环不是哈希表的示例


标准做法是使用boost、stl和许多其他流行库提供的哈希类。它可能不会像交换机那样快,但会比循环好得多。

您可以使用哈希表完成所需的任务。基本思想是将
89,94,38,54
映射到值
0,1,2,3
。 然后将执行查找

i = 38;
return hashtable[i];  //returns 2. 
如果最大值的上限很小(比如说99),那么这只是一个数组

int hashtable[100];

对于更复杂的场景,您可以使用哈希函数,或者最好是在编译时将switch语句优化为跳转表,因此这是不可能的。它们必须是编译时常量。(您能在编译阶段使用模板元编程生成它们吗?

您需要一个称为跳转表的东西—在您的例子中,是在运行时构建的。这基本上由一个函数对象数组组成,这些函数对象返回所需的值,您可以在其中使用键进行索引


您还可以使用哈希映射,如果范围相对较小,则效率较低,但如果范围较大,则效果肯定更好。

使用哈希映射。如果有一种更快的方法,人们会用它作为标准地图


还要记住,过早的优化是万恶之源。

如果你真的想要一个完美的散列,我建议你要么使用类似于库的东西,要么自己实现它(例如,请参见用python实现的例子)

12 Q没有公认的答案,似乎您的基准测试非常高。这将导致每个案例使用一个变量,并且完全不是动态的。在示例中,我给出的值小于100,但实际上我的键是64位地址,显然无法放入您所说的哈希表数组中。@在这种情况下,您需要查看哈希表实现。比如,我知道有很多散列实现,但我对一个完美的散列感兴趣。如果你知道一个好的64位键到16位值的方法,一定要告诉我。谢谢@MetallicPrist:std::map对于少量值应该可以正常工作。@完美哈希具有唯一的1-1对应关系,哈希键,没有冲突。如果键空间中没有已知的结构,这通常是无法实现的。再看看Hasturkuns的回复,实际上我的密钥是64位的,元素总数不会超过128。我可以容忍哈希函数在16位范围内返回的任何值。实际上,简单地说,我正在尝试实现返回16位唯一值的哈希(64位值)。