使用位数组
Use bit arrays?
本文关键字:数组 更新时间:2023-10-16
想象有一组固定不变的"选项"(例如技能)。每个对象(例如人)都可以有或没有任何选项。
我是否应该为每个对象维护一个选项成员列表,并用选项填充它?
或:
是否更有效(更快)使用bitarray,其中每个位代表各自的选项的采取(或不采取)状态?
《:-
更具体地说,技能列表是字符串(选项名称)的向量,绝对短于256。目标是使程序尽可能快(没有内存问题)。
那得看情况。如果选项的数量很少,则使用几个bool
成员来表示它们。如果列表变大,那么两个选项都是可行的:
- bitset(适当的
enum
符号表示选项)占用一个常数,非常小的空间量,并且获得某个选项需要O(1)时间; - 选项列表,或者更确切地说是它们的
std::set
或unordered_set
,可能更节省空间,但是只有如果选项数量很大,并且预计每个对象将设置非常少的选项。
当有疑问时,使用一堆bool
成员或bitset
成员。只有当分析显示存储选项成为负担时,才考虑使用动态列表或集合表示(即使这样,您也可能需要重新考虑您的设计)。
Edit:在少于256个选项的情况下,bitset
最多占用64字节,这绝对会在内存和可能的速度方面击败任何列表或集合表示。一堆bool
,甚至是一个unsigned char
数组,可能仍然更快,因为访问一个字节通常比访问一个位更快。但是复制结构会比较慢,所以尝试几个选项并测量结果。YMMV .
在一次操作中测试一个人是否具备多种技能时,使用位数组更快。
bitarray通常会更快地编辑和更快地搜索。至于需要多少空间,你自己算算吧。选项列表需要一个动态大小的数组(这在选项集本身上有一些开销);但是,如果有大量的选项,它可能会更小,如果(通常)只设置了少量的选项。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '