在C ++中存储位数组的最佳方法是什么(没有Boost,只是标准容器),例如,表示卷分配位图?
我认为std::vector<bool>
是个好主意,但apparently it's Evil and deprecated,那么有更好的选择吗?
如果我在内存中有一个字节数组,我该如何将它们复制到推荐的容器中?
(我在为vector<bool>
解决这个问题时遇到了麻烦。)
一个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,以减少所需的班次。但是整数可能仍然更快。
只是在6年后为后人发布这篇文章:就像其中一位评论者所说,我得出的结论是,使用std::vector<bool>
作为自己的专业类型是完全没问题的。你唯一需要注意的是不要把它当成标准的bool
容器,因为它不是。
对于vanilla C ++,有std::bitset.
Bitset非常类似于vector(也称为bit_vector):它包含一组位,并提供对每个位的恒定时间访问。 bitset和vector之间有两个主要区别。首先,不能更改位集的大小:bitset的模板参数N(指定位集中的位数)必须是整数常量。其次,bitset不是Sequence;事实上,它根本不是STL容器。
Matt Oysters有a nice article on its use.
另外:如果您的字节数组(位数组?)适合无符号长整数,那么您可以直接将其分配给std :: bitset:
unsigned long myByteArray = 0xABCD;
std::bitset<32> bitten( myByteArray );
我认为你链接到的网站上的一些观点顺便说一下是不正确的。在几乎每台计算机上,一个字母的大小实际上是一个字节(与字符相同),因为计算机只能在一个字节内写入一个字节而不是一个字节(如果可以,那么你只能拥有目前有八分之一的寻址空间带字节)
我只需要为您的向量使用一个字节,因为它可以让其他阅读代码的人更好地了解应用程序的内存占用情况。
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);
}
只要您的位数组具有固定大小,std::bitset就会这样做。 作为旁注,还有std :: dynamic_bitset,但我并非100%确定它已成为标准。
功能强大的C /С++位阵列库:https://github.com/noporpoise/BitArray