对许多离散值进行测试的首选方法
Preferred way to test against many discrete values?
我有以下场景:
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数除/模的情况,这可以通过简单的>>
和&
运算符完成,然后是一次内存读取]。
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 谷歌测试方法与流
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- 在 gtests 中测试C++全局变量的最佳方法
- std::is_invocable 用于测试任意方法是否存在的语法(不仅是运算符())
- C++ 谷歌模拟/单元测试:模拟方法未调用,原始方法是
- 更好的单元测试方法,花费的时间太长
- 多个 if-else 测试的更简单方法
- 生成用于测试的随机结构的通用方法
- cppUnit:针对多个测试方法执行一次的设置函数
- 有什么方法可以从Visual Studio 2017中的Catch C++测试中获取代码覆盖率指标?
- 如何测试基类中的方法是否已使用谷歌模拟调用和执行?
- 模板或链接接缝依赖注入有哪些替代方案来测试非虚拟方法?
- 单位测试私人方法通过使其自由功能
- 使用 CLion 在不同文件中分离 Boost 测试套件的正确方法
- 如何每次使用不同的参数多次测试方法
- 如何实例化多个 set 对象来测试 Set 类的各种构造函数和方法
- 使用Google Test API进行C 测试私人方法的可能方法是什么?
- 测试用户输入数组中的重复项的最有效方法是什么?