支持插入删除操作的bitset

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

你可能感兴趣的:(C/C++,Develop,algorithm,iterator,vector,测试,c)