关闭

stl之bit_vector原理及应用

标签: stlbit-vector
1558人阅读 评论(0) 收藏 举报
分类:

原理

  bit_vector容器具有vector容器一样的成员西数,常用于硬件端口的控制。区别于vector的一个重要特征是bit_vector更节省内存空间,一个元素只占用一个bit ,而不是一个字节。
bit_vector容器的每个元素是一个bit位值,取0或1,连续分配在以字为单位的字节块中,如图所示,13个bit分别为1011010100010,占用了一个字的内存空间。一个字为2个字节大小,共有16个bit 。
http://blog.csdn.net/lsh_2013
  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位的位置。
http://blog.csdn.net/lsh_2013
  接下来是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位分配内存。
http://blog.csdn.net/lsh_2013

应用

头文件

#include<vector>

创建bit_vector对象

这里与vector容器极为相似。构造函数如下:

  1. bit_vector()
  2. bit_vector(size_type n)
  3. bit_vector(size_type n, bool value)
  4. bit_vector(const bit_vector& )
  5. 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函数。

  1. pop_back();
  2. void erase(iterator pos);
  3. void erase(iterator first, iterator last);
  4. void clear();

元素的反向遍历

  1. reverse_iterator rbegin()
    返回作为容器反向遍历的第一个元素的位置。
  2. 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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:260052次
    • 积分:4283
    • 等级:
    • 排名:第7341名
    • 原创:160篇
    • 转载:14篇
    • 译文:0篇
    • 评论:53条
    博主简介
    邮箱:lshgoal@foxmail.com;
    最新评论
    常去的网站