如何在C ++中存储位数组?

时间:2011-10-20 00:35:19

标签: c++ stl bitmap containers bitarray

在C ++中存储位数组的最佳方法是什么(没有Boost,只是标准容器),例如,表示卷分配位图?

我认为std::vector<bool>是一个好主意,但是apparently it's Evil and deprecated,那么还有更好的选择吗?

同时

如果我在内存中有一个字节数组,我该如何将它们复制到推荐的容器中? (我在为vector<bool>找出这个问题时遇到了麻烦。)

6 个答案:

答案 0 :(得分:2)

一个char数组,然后按0x1屏蔽将作为一个位数组。

示例:

char bitarray[4]; // since 4*8 this array actually contains 32 bits

char getBit(int index) {
    return (bitarray[index/8] >> 7-(index & 0x7)) & 0x1;
}

void setBit(int index, int value) {
    bitarray[index/8] = bitarray[index/8] | (value & 0x1) << 7-(index & 0x7);
}
当然,这些操作通常比较慢,但如果记忆是一个问题,这是一个不错的方式。我为此选择了char,以减少所需的班次。但是整数可能会更快。

答案 1 :(得分:2)

仅仅为后人发布了这篇文章:就像其中一位评论者所说的那样,我得出的结论是,使用std::vector<bool>作为自己的专业类型,完全正常。您唯一需要注意的是不要将其视为标准bool容器,因为它不是。

答案 2 :(得分:1)

对于vanilla C ++,有std::bitset.

  

Bitset非常类似于vector(也称为bit_vector):它   包含一组位,并提供对其的恒定时间访问   每一点。 bitset和。之间有两个主要的区别   向量。首先,无法更改位集的大小:bitset's   模板参数N,指定的位数   bitset,必须是整数常量。其次,bitset不是Sequence;   事实上,它根本不是STL容器。

Matt Austern有a nice article on its use.

同时: 如果您的字节数组(位数组?)适合无符号长整数,那么您可以直接将它分配给std :: bitset:

unsigned long myByteArray = 0xABCD;
std::bitset<32> bitten( myByteArray );

答案 3 :(得分:0)

我认为你链接到的网站上的一些观点不正确。在几乎每台计算机上,一个字母的大小实际上是一个字节(与字符相同),因为计算机只能在一个字节内写入一个字节而不是一个字节(如果可以,那么你只能拥有目前有八分之一的寻址空间带字节)

我只会为您的向量使用一个字节,因为它可以让其他阅读代码的人更好地了解应用程序的内存占用情况。

Ram在现代计算机中非常丰富,所以你可以使用更大的整数类型,但实际上你不能小于一个字节。

要将数据从一个容器复制到另一个容器,首先要为容器创建一个迭代器

vector :: iterator myItr = myVector.begin()

并使用while循环或for循环迭代向量,直到myItr到达myVector.end()。

例如

for(vector<bool>::iterator myItr = myVector.begin(); myItr<myVector.end(); ++myItr)
{
   otherContainer.append(*myItr);
}

答案 4 :(得分:0)

只要您的位数组具有固定大小,std::bitset就会这样做 作为旁注,还有std :: dynamic_bitset,但我并非100%确定它已成为标准。

答案 5 :(得分:0)

强大的C /С++位数组库:https://github.com/noporpoise/BitArray