测试许多离散值的首选方法?

时间:2013-02-28 23:00:24

标签: c++

我有以下情况:

variable in {12, 4, 999, ... }:

列表中大约有100个离散值。我正在编写一个解析器来将其转换为C ++,我能想到的唯一方法是100个case语句,如果==

,则为100个

是对另一个人有偏好,还是有更好的方法来做到这一点?

我应该澄清一下,这些值是常数整数。感谢

3 个答案:

答案 0 :(得分:2)

如果任何一个离散值的最大值足够小,std::vector<bool>个标志设置为true或false,具体取决于该条目是否在列表中应该是非常理想的 - 假设值大致相等probabilility。

答案 1 :(得分:1)

一种方法是按顺序排列值,并使用二进制搜索来检查集合中是否包含值。

您可以使用std::lower_bound为插入点按顺序将值放入向量中,然后使用std::binary_search测试成员资格,或者将值放在{{1}中并免费获取该功能(使用std::set进行成员资格测试)。

有一些较小的性能考虑可能会使这两种选择更为可取;简介并自己决定。

第二种方法是将您的值放在哈希表中,例如std::set::find()(如果您的值是静态已知的话,则为某种静态等价物)。

答案 2 :(得分:1)

假设值是常量,您当然可以使用switch语句。编译器将使用二进制搜索类型方法或表[或表和二进制搜索的组合]非常有效地执行此操作。除非您对数字进行排序并采用二进制搜索类型方法,否则if语句的长列表将不会那么高效 - 切换语句更容易生成,因为编译器将找出最佳方法来确定哪些数字是在列表中,哪些不是。

如果值不是常量,那么switch语句显然不是解决方案。位图可能工作 - 再次,取决于实际范围 - 值是一个很大的范围,那么这不是一个好的解决方案,因为它将使用大量的内存[但它可能是最快的方法之一,因为它只是分割/模数为2 ^ n的情况,可以使用简单的>>&运算符,然后执行一次内存读取。