1. 程式人生 > >關於deque容器(雙端佇列)

關於deque容器(雙端佇列)

deque(雙端佇列)容器基本概念

  • vector容器是單向開口的連續記憶體空間,deque則是一種雙向開口的連續線性空間。所謂的雙向開口,意思是可以在頭尾兩端分別做元素的插入和刪除操作,當然,vector
    容器也可以在頭尾兩端插入元素,但是在其頭部操作效率奇差,無法被接受。
  • deque沒有容量的概念,因為它是動態的以分段連續空間組合而成,隨時可以增加一段新的空間並連結起來,換句話說,像vector那樣,”舊空間不足而重新配置一塊更大空間,然後複製元素,再釋放舊空間”這樣的事情在deque身上是不會發生的。也因此,deque沒有必須要提供所謂的空間保留(reserve)功能.
  • 雖然deque容器也提供了Random Access Iterator,但是它的迭代器並不是普通的指標,其複雜度和
    vector不是一個量級,這當然影響各個運算的層面。因此,除非有必要,我們應該儘可能的使用vector
    ,而不是deque。對deque進行的排序操作,為了最高效率,可將deque先完整的複製到一個vector中,對vector容器進行排序,再複製回deque.

deque容器實現原理

  • vector雖可成長,卻只能向尾端成長,而且其成長其實是一個假象,事實上
    • 申請更大空間
    • 原資料複製新空間
    • 釋放原空間 三步驟,

如果不是vector每次配置新的空間時都留有餘裕,其成長假象所帶來的代價是非常昂貴的。

  • deque是由一段一段的定量的連續空間構成。一旦有必要在deque
    前端或者尾端增加新的空間,便配置一段連續定量的空間,串接在deque的頭端或者尾端。deque最大的工作就是維護這些分段連續的記憶體空間的整體性的假象,並提供隨機存取的介面,避開了重新配置空間,複製,釋放的輪迴,代價就是複雜的迭代器架構。
  • 既然deque是分段連續記憶體空間,那麼就必須有中央控制,維持整體連續的假象,資料結構的設計及迭代器的前進後退操作頗為繁瑣。deque程式碼的實現遠比vectorlist都多得多。
  • deque採取一塊所謂的map(注意,不是STLmap容器)作為主控,這裡所謂的map是一小塊連續的記憶體空間,其中每一個元素(此處成為一個結點)都是一個指標,指向另一段連續性記憶體空間,稱作緩衝區。緩衝區才是deque的儲存空間的主體。

deque實現原理

deque建構函式

deque<T> deqT;//預設構造形式
deque(begin, end);//建構函式將[beg, end)區間中的元素拷貝給本身。
deque(n, elem);//建構函式將n個elem拷貝給本身。
deque(const deque &deq);//拷貝建構函式。

deque賦值操作

assign(begin, end);//將[beg, end)區間中的資料拷貝賦值給本身。
assign(n, elem);//將n個elem拷貝賦值給本身。
deque& operator=(const deque &deq); //過載等號操作符 
swap(deq);// 將deq與本身的元素互換

deque大小操作

deque.size();//返回容器中元素的個數
deque.empty();//判斷容器是否為空
deque.resize(num);//重新指定容器的長度為num,若容器變長,則以預設值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。
deque.resize(num, elem); //重新指定容器的長度為num,若容器變長,則以elem值填充新位置,如果容器變短,則末尾超出容器長度的元素被刪除。

deque雙端插入和刪除操作

push_back(elem);//在容器尾部新增一個數據
push_front(elem);//在容器頭部插入一個數據
pop_back();//刪除容器最後一個數據
pop_front();//刪除容器第一個資料

deque雙端插入和刪除操作

at(idx);//返回索引idx所指的資料,如果idx越界,丟擲out_of_range。
operator[];//返回索引idx所指的資料,如果idx越界,不丟擲異常,直接出錯。
front();//返回第一個資料。
back();//返回最後一個數據

deque插入操作

insert(pos,elem);//在pos位置插入一個elem元素的拷貝,返回新資料的位置。
insert(pos,n,elem);//在pos位置插入n個elem資料,無返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)區間的資料,無返回值。

deque刪除操作

clear();//移除容器的所有資料
erase(beg,end);//刪除[beg,end)區間的資料,返回下一個資料的位置。
erase(pos);//刪除pos位置的資料,返回下一個資料的位置。