C++的基礎知識(十)--deque

deque與vector非常相似。它也採用動態數組管理元素,提供隨機存取,有着和vector幾乎一樣的接口。不同的是deque的動態數組頭尾都開放,因此能在頭尾兩端進行快速安插和刪除。

deque與vector的主要不同之處在於:

  1. 兩端都能快速安插和刪除元素,這些操作可以在分期攤還的常數時間(amortized constant time)內完成。
  2. 元素的存取和迭代器的動作比vector稍慢。
  3. 迭代器需要在不同區塊間跳轉,所以它非一般指針。
  4. 因爲deque使用不止一塊內存(而vector必須使用一塊連續內存),所以deque的max_size()可能更大。
  5. 不支持對容量和內存重新分配時機的控制。不過deque的內存重分配優於vector,因爲其內部結構顯示,deque不必在內存重分配時複製所有元素。
  6. 除了頭尾兩端,在任何地方安插或刪除元素,都將導致指向deque元素的所有pointers、references、iterators失效。
  7. deque的內存區塊不再被使用時,會自動被釋放。deque的內存大小是可自動縮減的。
  8. deque與vector組織內存的方式不一樣。在底層,deque按“頁”(page)或“塊”(chunk)來分配存儲器,每頁包含固定數目的元素。而vector只分配一塊連續的內存。例如,一個10M字節的vector使用的是一整塊10M字節的內存,而deque可以使用一串更小的內存塊,比如10塊1M的內存。所以不能將deque的地址(如&deque[0])傳遞給傳統的C API,因爲deque內部所使用的內存不一定會連續。

deque與vector相似點:
1. 在中部安插、刪除元素的速度較慢。
2. 迭代器屬於random access iterator(隨機存取迭代器)。

使用deque需注意:
1. 除了at( ),其它成員函數均不會檢查索引或迭代器是否有效。
2. 任何插入或刪除動作都會使所有指向deque元素的pointers、references、iteartors失效,唯一例外的是在頭部或尾部插入元素(此時pointers和references仍然有效,但iterators失效)。
3. .vector還有一個不好的地方,當你往一個vector裏添加一個成員的時候,所有指向這個vector的原來成員的指針就不能保證有效了,因爲 vector會re-alloc內存.而deque不會,無論從前面還是後面添加新成員,舊的成員都不會移動位置,這一點有時候很有用

優先使用vector,還是deque?
c++標準建議:vector是那種應該在默認情況下使用的序列。如果大多數插入和刪除操作發生在序列的頭部或尾部時,應該選用deque。

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