bit_vector原理及应用

原理

  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容器极为相似。构造函数如下:

  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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 12:48:38

bit_vector原理及应用的相关文章

第10章 bit_vector位向量容器

第10章 bit_vector位向量容器   10.1 bit_vector技术原理   10.2 bit_vector应用基础   10.3 本章小结 这本书讲bit_vector,而不讲bitset容器,有点奇怪.   略

JVM原理讲解和调优

一.什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译.Java语言使用Java虚拟机屏蔽了与具体平台相关的信息

小米手环 / 运动手环 记步功能原理

很多朋友是第一次接触像小米手环这类运动计步产品,对于那么轻盈小巧的手环能够精准计步,甚至能详细完整的记录睡眠时间觉得非常神奇,本文就和大家详细说说在看不见的小米手环背板下,它是怎么工作的. 1. 手机上的运动步数是怎么来的? A:简单来说:小米手环能够精准计步由硬件和软件算法两方面组成,缺一不可. 硬件 是指小米手环里内置的那枚强悍的三轴加速度传感器ADXL362 (注1),军用级,大家知道想要达到军用级,这得有多苛刻.其实三轴加速度传感器不神秘,在大多数中高档手机里都有配备加速度传感器,只是在

Nginx为什么比Apache Httpd高效:原理篇

一.进程.线程? 进程是具有一定独立功能的,在计算机中已经运行的程序的实体.在早期系统中(如linux 2.4以前),进程是基本运作单位,在支持线程的系统中(如windows,linux2.6)中,线程才是基本的运作单位,而进程只是线程的容器.程序 本身只是指令.数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例.若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循 序)或异步(平行)的方式独立运行.现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借

Jsp通过Filter实现UrlRewriter原理

web.xml文件: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&q

MyBatis框架中Mapper映射配置的使用及原理解析(七) MapperProxy,MapperProxyFactory

从上文<MyBatis框架中Mapper映射配置的使用及原理解析(六) MapperRegistry> 中我们知道DefaultSqlSession的getMapper方法,最后是通过MapperRegistry对象获得Mapper实例: public <T> T getMapper(Class<T> type, SqlSession sqlSession) { final MapperProxyFactory<T> mapperProxyFactory =

Android分包MultiDex原理详解

MultiDex的产生背景 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt.DexOpt的执行过程是在第一次加载Dex文件的时候执行的.这个过程会生成一个ODEX文件,即Optimised Dex.执行ODex的效率会比直接执行Dex文件的效率要高很多. 但是在早期的Android系统中,DexOpt有一个问题,DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面.但是这个链表的长度是用一个short类型来保存的,导致

状态检测防火墙原理

状态检测防火墙原理 防火墙发展到今天,虽然不断有新的技术产生,但从网络协议分层的角度,仍然可以归为以下三类: 1.包过滤防火墙: 2.基于状态检测技术(Stateful-inspection)的防火墙: 3.应用层防火墙 这三类防火墙都是向前兼容的,即基于状态检测的防火墙也有一般包过滤防火墙的功能,而基于应用层的防火墙也包括前两种防火墙的功能.由于<<浅>>文已讲了第一类防火墙,在这里我就讲讲基于状态检测技术的防火墙的实现原理. 为什么会有基于状态检测的防火墙呢?这就要先看看第一类

JS 实现无缝滚动动画原理(初学者入)

这段时间在教培训班的学生使用原生javascript实现无缝滚动的动画案例,做了这个原理演示的动画,分享给自学JS的朋友!博主希望对你们有帮助! 在讲解之前先看一下demo: demo:https://224137748.github.io/JS_warehouse/lunbo/domo.HTML源码:https://github.com/224137748/JS_warehouse/blob/master/lunbo/domo.HTML ps: 上面和下面的滚动进度是一致的,上面红色框是为了演