对许多离散值进行测试的首选方法

Preferred way to test against many discrete values?

本文关键字:方法 测试 许多离      更新时间:2023-10-16

我有以下场景:

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

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

是一个比另一个更受欢迎,还是有一个全面的更好的方法来做到这一点?

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

如果任何一个离散值的最大值足够小,则根据该条目是否在列表中,std::vector<bool>的标志设置为真或假应该是非常理想的-假设这些值以大约相等的概率出现

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

您可以使用std::lower_bound作为插入点,然后使用std::binary_search来测试成员资格,或者您可以将您的值放在std::set中并免费获得该功能(使用std::set::find()进行成员资格测试)。

有一些小的性能考虑可能使这两个选项更可取;

第二种方法是将您的值放在哈希表中,例如std::unordered_set(或者如果您的值是静态已知的,则使用某种静态等效)。

假设这些值是常量,您当然可以使用switch语句。编译器将非常有效地完成这项工作,使用二进制搜索类型方法或表[或表和二进制搜索的组合]。一长串if语句不会那么高效,除非你对数字进行排序并使用二进制搜索类型的方法——一个switch语句更容易生成,因为编译器会排序出最好的方法来决定哪些数字在列表中,哪些不在。

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