我有以下情况:
variable in {12, 4, 999, ... }:
列表中大约有100个离散值。我正在编写一个解析器来将其转换为C ++,我能想到的唯一方法是100个case语句,如果==
,则为100个是对另一个人有偏好,还是有更好的方法来做到这一点?
我应该澄清一下,这些值是常数整数。感谢
答案 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的情况,可以使用简单的>>
和&
运算符,然后执行一次内存读取。