使用位数组

Use bit arrays?

本文关键字:数组      更新时间:2023-10-16

想象有一组固定不变的"选项"(例如技能)。每个对象(例如人)都可以有或没有任何选项。

我是否应该为每个对象维护一个选项成员列表,并用选项填充它?

或:

是否更有效(更快)使用bitarray,其中每个位代表各自的选项的采取(或不采取)状态?

《:-

更具体地说,技能列表是字符串(选项名称)的向量,绝对短于256。目标是使程序尽可能快(没有内存问题)。

那得看情况。如果选项的数量很少,则使用几个bool成员来表示它们。如果列表变大,那么两个选项都是可行的:

  • bitset(适当的enum符号表示选项)占用一个常数,非常小的空间量,并且获得某个选项需要O(1)时间;
  • 选项列表,或者更确切地说是它们的std::setunordered_set,可能更节省空间,但是只有如果选项数量很大,并且预计每个对象将设置非常少的选项。

当有疑问时,使用一堆bool成员或bitset成员。只有当分析显示存储选项成为负担时,才考虑使用动态列表或集合表示(即使这样,您也可能需要重新考虑您的设计)。

Edit:在少于256个选项的情况下,bitset最多占用64字节,这绝对会在内存和可能的速度方面击败任何列表或集合表示。一堆bool,甚至是一个unsigned char数组,可能仍然更快,因为访问一个字节通常比访问一个位更快。但是复制结构会比较慢,所以尝试几个选项并测量结果。YMMV .

在一次操作中测试一个人是否具备多种技能时,使用位数组更快。

如果你使用选项列表,那么你必须一次一个项目地查看列表,以确定是否存在技能集,这显然会花费更多的时间,并需要许多比较操作。

bitarray通常会更快地编辑和更快地搜索。至于需要多少空间,你自己算算吧。选项列表需要一个动态大小的数组(这在选项集本身上有一些开销);但是,如果有大量的选项,它可能会更小,如果(通常)只设置了少量的选项。