stl之bit_vector原理及应用

原创 2015年07月10日 23:32:12

原理

  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

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

C++ STL学习笔记六 bit_vector位向量容器

/* * ******************************************** * bit_vector位向量容器的基础说明: *************************...
  • cumirror
  • cumirror
  • 2010年04月12日 18:38
  • 4590

bit_vector位向量容器

http://blog.163.com/zhoumhan_0351/blog/static/3995422720103892031806/ bit_vector位向量容器 一、原理 ...
  • f81892461
  • f81892461
  • 2013年02月20日 22:59
  • 1783

bit_vector位向量容器

一、原理 bit_vector位向量容器是一个bit位元素的序列容器,具有vector容器一样的成员函数,常用于硬件端口的控制。区别于vector的一个重要特性是bit_vector更节省内存空间,...
  • u012905667
  • u012905667
  • 2013年12月25日 20:29
  • 597

C/C++ 字节序/位域(Bit-fields)之我见

前言很早想说说这个问题了,经常也会有很多公司拿位域出来考人,呵呵要真的想弄清楚还要一点点的分析。这里先看看网宿的一道笔试题目,这道题目我之前是复制网上的,结果不对,修改了一下,可以正确运行了,谢谢(i...
  • ztz0223
  • ztz0223
  • 2008年12月24日 21:36
  • 21340

C++ Bit Fields

See AlsoClasses, Structures, and UnionsClasses and structures can contain members that occupy less s...
  • flymarco
  • flymarco
  • 2010年02月24日 16:59
  • 1155

C++ biteset

#include #include using namespace std; int main() { bitset b1; bitset b2("00001111");//不能用非0...
  • yang382197207
  • yang382197207
  • 2015年02月05日 15:55
  • 475

C/C++ bit 位操作

一些有关C++语言中的bit操作1)  函数实现交换两个int型变量的值,要求不定义任何中间变量。C / C++ 版:void Swap(int *a, int *b){*a^=*b;   *b^=*...
  • paobo
  • paobo
  • 2006年03月24日 12:11
  • 7475

一些有关C++语言中的bit操作

http://blog.csdn.net/dreamXren/article/details/540245 以下大多从网上和书中来,有些则加入了个人的见解~~ 1)  函数实现交换两个int型...
  • weinierbian
  • weinierbian
  • 2013年12月11日 21:18
  • 1128

C++位操作技巧

一、注意事项: a、与:&,两位都为1,才为1; b、或:|,两位都为0,才为0; c、微操作只能用于整形数据,float和double进行位操作时编译器会报错; d、异或:^,两位相同为0,...
  • bit_x
  • bit_x
  • 2013年10月17日 15:36
  • 2187

bit_vector位向量容器

http://blog.163.com/zhoumhan_0351/blog/static/3995422720103892031806/ bit_vector位向量容器 一、原理 ...
  • f81892461
  • f81892461
  • 2013年02月20日 22:59
  • 1783
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:stl之bit_vector原理及应用
举报原因:
原因补充:

(最多只允许输入30个字)