STL之Deque雙端佇列

2021-06-08 00:01:45 字數 2963 閱讀 7076

今天要寫乙個樹的層次遍歷程式,要用到佇列,於是就查了一下deque的資料,如下。

deque 總覽

deque 和 vector 一樣都是標準模板庫中的內容, deque 是雙端佇列,在介面上和 vector 非常相似,在許多操作的地方可以直接替換。假如讀者已經能夠有效地使用 vector 容器,下面提供deque 的成員函式和操作,進行對比參考。

deque 成員函式函式

描述 c.assign(beg,end)

c.assign(n,elem)

將 [beg; end) 區間中的資料賦值給 c 。

將 n 個 elem 的拷貝賦值給 c 。

c.at(idx)

傳回索引 idx 所指的資料,如果 idx 越界,丟擲out_of_range

。c.back()

傳回最後乙個資料,不檢查這個資料是否存在。

c.begin()

傳回迭代器重的可乙個資料。

c.clear()

移除容器中所有資料。

deque c

deque c1(c2)

deque c(n)

deque c(n, elem)

deque c(beg,end)

c.~deque()

建立乙個空的 deque

。複製乙個 deque

。建立乙個 deque ,含有 n 個資料,資料均已預設構造產生 。

建立乙個含有 n 個 elem 拷貝的 deque

。建立乙個以 [beg;end) 區間的 deque

。銷毀所有資料,釋放記憶體。

c.empty()

判斷容器是否為空。

c.end()

指向迭代器中的最後乙個資料位址。

c.erase(pos)

c.erase(beg,end)

刪除 pos 位置的資料,傳回下乙個資料的位置。

刪除 [beg,end) 區間的資料,傳回下乙個資料的位置 。

c.front()

傳回地乙個資料。

get_allocator

使用建構函式返回乙個拷貝。

c.insert(pos,elem)

c.insert(pos,n,elem)

c.insert(pos,beg,end)

在 pos 位置插入乙個 elem 拷貝,傳回新資料位置。

在 pos 位置插入 n 個 elem 資料。無返回值。

在 pos 位置插入在 [beg,end) 區間的資料。無返回值。

c.max_size()

返回容器中最大資料的數量。

c.pop_back()

刪除最後乙個資料。

c.pop_front()

刪除頭部資料。

c.push_back(elem)

在尾部加入乙個資料。

c.push_front(elem)

在頭部插入乙個資料。

c.rbegin()

傳回乙個逆向佇列的第乙個資料。

c.rend()

傳回乙個逆向佇列的最後乙個資料的下乙個位置。

c.resize(num)

重新指定佇列的長度。

c.size()

返回容器中實際資料的個數。

c1.swap(c2)

swap(c1,c2)

將 c1 和 c2 元素互換。

同上操作。

deque

操作函式

描述operator

返回容器中指定位置的乙個引用。

上面這些特徵和 vector 明顯相似,所以我們會提出下面的疑問。

問題:如果

deque

和vector

可以提供相同功能的時候,我們使用哪乙個更好呢?

回答:如果你要問的話,就使用 vector 吧。

或者你給個解釋?

非常高興你這樣問,的確,這並不是無中生有的,事實上,在 c++ 標準裡解釋了這個問題,在 23.1.1span style="font-size: 9pt; font-family: 宋體; mso-ascii-font-family: 'times new roman'; mso-hansi-font-family: 'times new roman'">章節有下面乙個片斷:

vector 在預設情況下是典型的使用序列的方法,對於 deque ,當使用插入刪除操作的時候是乙個更好的選擇。

有趣的是,本文就是要非常徹底地理解這句話。

什麼是新的?

細讀上面兩張**,你會發現和 vector 比較這裡增加了兩個函式。

1 、 c.push_front(elem) 

—— 在頭部插入乙個資料。

2 、 c.pop_front() 

—— 刪除頭部資料。

呼叫方法和 c.push_back(elem) 和 c.pop_back() 相同,這些將來會告訴我們對於 deque 會非常有用, deque 可以在前後加入資料。

缺少了什麼?

同時你也會發現相對於vector> 缺少了兩個函式,你將了解到deque> 不需要它們。

1、capacity()—— 返回vector當前的容量。

2、reserve() —— 給指定大小的vector> 分配空間。

這裡是我們真正研究的開始,這裡說明deque> 和vector它們在管理內部儲存的時候是完全不同的。deque是大塊大塊地分配記憶體,每次插入固定數量的資料。vector是就近分配記憶體(這可能不是乙個壞的事情)。但我們應該關注是,vector每次增加的記憶體足夠大的時候,在當前的記憶體不夠的情況。下面的實驗來驗證deque不需要capacity()和reserve()> 是非常有道理的。

STL雙端佇列 deque

include include include include includeusing namespace std deque採用一塊map 不是stl中的map,是一塊連續空間 作為主控,每個元素都是乙個節點 cur fist last node 指向另一段連續較大的空間 成為緩衝區 預設512...

STL順利容器之雙端佇列 deque

雙端佇列是由動態陣列實現。標頭檔案 include 構造方法 dequedeq 建立乙個沒有任何元素的雙端佇列 dequedeq otherdeq 用另乙個型別相同雙端佇列初始化該雙端佇列 dequedeq size 初始化乙個固定size的雙端佇列 dequedeq n,element 初始化n個...

STL(七)deque雙端佇列容器

deque雙端佇列容器與vector非常相似,不僅可在尾部插入和刪除,還可在頭部插入和刪除,時間複雜度是o 1 是乙個實現了random access container,back insertion sequence 和 front insertion sequence概念的模型。deque內部的...