使用位数组?

时间:2011-08-15 18:07:49

标签: c++ bitarray

想象一下,有一套固定且不变的“选项”(例如技能)。每个对象(例如人类)都可以拥有或不拥有任何选项。

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

OR:

使用比特数是否更有效(更快),每个比特代表相应选项的采取(或不采取)状态?

-edited: -

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

3 个答案:

答案 0 :(得分:2)

这取决于。如果选项数量很少,则使用多个bool成员来表示它们。如果列表变大,那么您的选择都变得可行:

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

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

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

答案 1 :(得分:1)

在单个操作中测试人员中是否存在多种技能时,使用位数组会更快。

如果您使用选项列表,那么您必须一次查看列表中的一项,以查找技能组是否退出,这显然需要更多时间并需要进行许多比较操作。

答案 2 :(得分:0)

比特阵列通常编辑速度更快,搜索速度更快。至于所需的空间,只需做数学。选项列表需要一个动态大小的数组(这会比一组选项本身带来一些开销);但如果有大量选项,如果(通常)只设置了少量选项,则可能会更小。