支援插入刪除操作的bitset

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.