C++ 之 deque


特性

  1. deque雙端隊列不規則的首字母縮寫,雙端隊列是動態大小的序列式容器,其可以向兩端進行伸縮
  2. 特定的庫可以以不同的方式實現deque,但通常都是一種動態數組。不論在何種情況下,它都允許通過隨機訪問迭代器直接訪問單個元素,可以根據需要動態的伸縮。
  3. 因此,deque提供了一些與vector相似的功能,但deque在頭部和尾部進行數據插入和刪除操作更加高效。
    vector不同的是,deque不能保證所有的元素存儲在連續的空間中,在deque中通過指針 + 偏移量方式訪問元素可能會導致非法的操作。
  4. vectorlist提供了相似的接口,因此其具有類似的用途,但是內部的實現原理不同:
    vector使用使用了動態數組,該數組通常需要動態增長;
    deque中的元素可能分散在不同的存儲塊中,在deque中保存了一些必要的信息,通常用來在常數範圍內直接訪問deque中的任何一個元素,所以deque的內部實現比vector複雜,但是這些額外信息使得deque在某些情況下增長更加的高效,特別是在序列比較大,重新分配成本比較高的情況下
  5. 除了在頻繁在頭部或尾部進行插入和刪除操作外,dequelistforward_list的性能更差。

迭代器

雙端隊列底層是一段假想的連續空間,實際是分段連續的,爲了維護其“整體連續”的假象,落在了deque的迭代器身上。

下圖爲deque的原理圖:

在這裏插入圖片描述
從下到上的方格依次是:迭代器,中控器,緩衝區

deque::begin()返回迭代器的startdeque::end()返回迭代器的finish,這兩個迭代器都是dequedata member

它就是一個靠中控映射實現的結構。


小結

deque在序列式容器中出現場景比較少,因爲:

  • 如果只是簡單的存儲元素,使用vector即可
  • 如果對元素任意位置進行插入或者刪除操作比較多,使用list即可

deque最大的應用:用其作爲標準庫中stackqueue的底層結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章