支持插入删除操作的bitset

开发中需要支持插入删除操作的位图结构,开始选用std::bitset,但是发现效率非常低。于是赶紧找找,看看有没有别的可用。查资料发现,bit_vector曾经有,现在基本不支持了;按照《Effective STL》的说法,vector<bool>是不推荐使用的,第一,它不是一个真正STL容器,第二,它并不保存bool类型。一个替代是deque<bool>,它是一个STL容器,它保存真正的bool值,当然,deque底层的内存不连续。另外就是bitset,bitset不是一个STL容器,但它是C++标准库的一部分,与STL容器不同,它的大小(元素总数)在编译期固定,因此它不能高效的支持插入和删除元素,进一步,因为它不是一个STL容器,所以它也不支持iterator。由于bitset固定长度,因此在移位的时候每次都要将所有bit移动一位! 测试了一下deque<bool>与bitset的性能:50000位,100000次更新。 只是更新,从一边插入元素,另一边删除元素。deque<bool>耗时小于10ms,而bitset耗时则在400ms左右。 更新,并且每次更新后都计算1的个数,deque<bool>用algorithm模块的count方法,bitset提供count方法。deque<bool>耗时约13秒,bitset耗时约1.5秒。 更新,并且每次更新后都与一个实现准备好的bit序列做与操作,deque<bool>用algorithm模块的transform方法,bitset提供&操作符。由于操作耗时非常多,将deque<bool>的更新次数降低为1000,将bitset更新次数降低为10000。deque<bool>耗时约1.8秒,bitset耗时约0.08秒。  总结:bitset确实是专业做这个的,各种与bit相关操作(计数、与或操作等)的效率都非常高,并且可以根据下标进行访问,唯一缺点是长度必须在编译时确定,因此移位操作(删除等)的效率很低。一个偷懒的改进办法就是,预先指定比需要的大一些的长度。Deque<bool>毕竟是顺手帮忙,插入删除的效率都很高,但是bit相关操作的效率就太差了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值