開發中需要支援插入刪除操作的位元影像結構,開始選用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相關操作的效率就太差了。