原理
bit_vector容器具有vector容器一样的成员西数,常用于硬件端口的控制。区别于vector的一个重要特征是bit_vector更节省内存空间,一个元素只占用一个bit ,而不是一个字节。
bit_vector容器的每个元素是一个bit位值,取0或1,连续分配在以字为单位的字节块中,如图所示,13个bit分别为1011010100010,占用了一个字的内存空间。一个字为2个字节大小,共有16个bit 。
bit_vector容器的实现,首先需要解决若干bit位的内存分配和迭代器对bit位元素的随机读写问题。bit 位的内存分配,由内存分配器根据 bit 位的个数需求,一次性地分配若干字,以后通过动态分配内存进行bit位的添加。随机访问迭代器,通过所在的字和位的偏移给出一个 bit 位的确切位置。bit 位的随机读写,利用C++的bit位操作运算,如位与、位或和异或等,判断某个bit位值为1或0,或设置某个bit位为1或0。
如图所示,假设为bit位分配了连续的3个机器字的空间,共6个字节,16×3=48个 bit。为了对灰色的 bit 位进行读写,Bit_reference 结构体使用了一个标志 bit 位所在字的M_p指针变量,它的类型为unsigned int*,正好作为一个字的指针类型。此外,还使用一个M_mask变量,标记bit位在这个字中的偏移量。对于图所示的情形,M_p指向灰色bit位所在的第2个字,M_mask为0010000000000000,唯一的一个“1”,表示当前读写的bit位的位置。
接下来是bit_vector的分配器。Bvector_alloc_base类定义3个protected成员变量M_start、M_finish和M_end_of_storage,将用于继承类中,标记起始元素、最后一个元素的下一位置和整个bit_vector容器内存空间的结束地址。此外,也提供一个M_bit_alloc(size_t n)函数,以字为单位为n个bit位分配内存。
应用
头文件
#include<vector>
创建bit_vector对象
这里与vector容器极为相似。构造函数如下:
- bit_vector()
- bit_vector(size_type n)
- bit_vector(size_type n, bool value)
- bit_vector(const bit_vector& )
- bit_vector(InputIterator first, InputIterator last)
初始化赋值
与vector一样,bit_vector提供在尾部添加bit位元素的push_back函数。
bit_vector bv;
bv.pushback(true);
bv.pushback(false);
元素的插入和访问
bit_vector容器的bit位元素的访问,可采用迭代器或数组方式进行。元素的插入可用insert函数。
bit_vector bv(3);
bv[0]=1;
bv[1]=0;
bv[2]=1;
bit_vector::iterator i;
i=bv.begin();
bv.insert(i,0);
元素的删除
bit_vector提供了删除最后一个元素的pop_back函数、删除迭代器所指元素的erase函数和全部元素清除的clear函数。
- pop_back();
- void erase(iterator pos);
- void erase(iterator first, iterator last);
- void clear();
元素的反向遍历
- reverse_iterator rbegin()
返回作为容器反向遍历的第一个元素的位置。
- reverse_iterator rend()
返回作为容器反向遍历的尾端元素的位置。
其他常用函数
bool empty()
size_type size()
size_type capacity()
参考文献见:http://www.sgi.com/tech/stl/bit_vector.html
转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46836341
版权声明:本文为博主原创文章,未经博主允许不得转载。