Deques

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

Deques VS Vectors

不同點

  • Deque兩端都能進行快速安插和移除元素,均能在常數時間內完成。

  • 存取元素時,deque的內部結構會多一個間接過程,所以元素的存取和迭代器的動作會稍慢與vector。

  • 迭代器不需要再不同的區塊間跳轉,所以必須是特殊的智能指針而非一般指針。

  • 在對內存區塊有所限制的系統中,deque可以包含更多元素,因爲它使用不止一塊內存。因此deque的max_size()可能更大。

  • deque不支持對容量和內存重分配時機的控制。特別注意的是,除了頭尾兩端,在任何地方安插或刪除元素,都會導致指向deque元素的任何pointers、references、iterators失效。不過,deque的內存分配由於vector,因爲其內部結構顯示,deques不必再內存重新分配時複製所有元素。

  • deque的內存塊不在被使用時,會被釋放。deque的內存是可以縮減的,根據具體實作版本確定。

相同點

  • 在中間部分安插、刪除元素的相對速度較慢
  • 迭代器屬於隨機存取迭代器

操作函數

主要可以參考前面這篇
http://blog.csdn.net/u012706792/article/details/54616316

deque和vector操作函數的不同點

  • deques不提供容量函數capacity(),reverse()
  • deques直接提供函數,用以完成頭部元素的安插和刪除push_front()和pop_front()

另外值得思考的事情還有

  • 除了at(),沒有任何成員函數會檢查索引或者迭代器是否有效

  • 元素的插入或刪除可能導致內存重新分配,所以任何插入或刪除動作都會使得所有指向deques元素的pointers、references和iterators失效。唯一例外的在頭部或尾部刪除元素,執行動作之後,pointers和references仍然有效(但iterators就沒這這麼幸運)

    deque<int> coll;
    int i = 0;
    coll.push_back(++i);
    coll.push_back(++i);
    coll.push_back(++i);
    deque<int>::iterator pos;
    pos = coll.begin();
    cout << *pos;
    coll.push_back(++i);
    cout << *pos; //此處崩潰

不妨多寫兩個demo,好好避避deque的坑

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