想象一下,有一套固定且不变的“选项”(例如技能)。每个对象(例如人类)都可以拥有或不拥有任何选项。
我应该为每个对象维护一个成员列表选项并用选项填充它吗?
OR:
使用比特数是否更有效(更快),每个比特代表相应选项的采取(或不采取)状态?
-edited: -
更具体地说,技能列表是字符串向量(选项名称),绝对短于256。 目标是使程序尽可能快(无内存问题)。
答案 0 :(得分:2)
这取决于。如果选项数量很少,则使用多个bool
成员来表示它们。如果列表变大,那么您的选择都变得可行:
enum
以象征性方式表示选项)占用一个恒定且非常小的空间量,获得某个选项需要O(1)时间; std::set
或unordered_set
,可能更节省空间,但如果选项数量巨大,仅,预计每个对象将设置非常少的数量。如有疑问,请使用一组bool
成员或bitset
。只有在分析显示存储选项成为负担时,才考虑动态列表或集合表示(即使这样,您可能还想重新考虑您的设计)。
编辑:少于256个选项,bitset
最多需要64个字节,这绝对会在内存和速度方面超过任何列表或集合表示。一堆bool
,甚至是unsigned char
的数组,可能仍然更快,因为访问字节通常比访问位更快。但是复制结构会比较慢,所以尝试几个选项并测量结果。 YMMV。
答案 1 :(得分:1)
在单个操作中测试人员中是否存在多种技能时,使用位数组会更快。
如果您使用选项列表,那么您必须一次查看列表中的一项,以查找技能组是否退出,这显然需要更多时间并需要进行许多比较操作。
答案 2 :(得分:0)
比特阵列通常编辑速度更快,搜索速度更快。至于所需的空间,只需做数学。选项列表需要一个动态大小的数组(这会比一组选项本身带来一些开销);但如果有大量选项,如果(通常)只设置了少量选项,则可能会更小。