deque(雙端隊列)容器

deque 是 double-ended queue 的縮寫,又稱雙端隊列容器。

  • deque 容器擅長在序列尾部添加或刪除元素(時間複雜度爲O(1)),而不擅長在序列中間添加或刪除元素。
  • deque 容器也可以根據需要修改自身的容量和大小。

和 vector 不同的是,deque 還擅長在序列頭部添加或刪除元素,所耗費的時間複雜度也爲常數階O(1)。並且更重要的一點是,deque 容器中存儲元素並不能保證所有元素都存儲到連續的內存空間中。

當需要向序列兩端頻繁的添加或刪除元素時,應首選 deque 容器。

創建deque容器的幾種方式

創建 deque 容器,根據不同的實際場景,可選擇使用如下幾種方式。

1) 創建一個沒有任何元素的空 deque 容器:

std::deque<int> d;

和空 array 容器不同,空的 deque 容器在創建之後可以做添加或刪除元素的操作,因此這種簡單創建 deque 容器的方式比較常見。

2) 創建一個具有 n 個元素的 deque 容器,其中每個元素都採用對應類型的默認值:

std::deque<int> d(10);

此行代碼創建一個具有 10 個元素(默認都爲 0)的 deque 容器。

3) 創建一個具有 n 個元素的 deque 容器,併爲每個元素都指定初始值,例如:

std::deque<int> d(10, 5)

如此就創建了一個包含 10 個元素(值都爲 5)的 deque 容器。

4) 在已有 deque 容器的情況下,可以通過拷貝該容器創建一個新的 deque 容器,例如:

std::deque<int> d1(5);
std::deque<int> d2(d1);

注意,採用此方式,必須保證新舊容器存儲的元素類型一致。

5) 通過拷貝其他類型容器中指定區域內的元素(也可以是普通數組),可以創建一個新容器,例如:

//拷貝普通數組,創建deque容器
int a[] = { 1,2,3,4,5 };
std::deque<int>d(a, a + 5);
//適用於所有類型的容器
std::array<int, 5>arr{ 11,12,13,14,15 };
std::deque<int>d(arr.begin()+2, arr.end());//拷貝arr容器中的{13,14,15}

deque容器可利用的成員函數

函數成員 函數功能
begin() 返回指向容器中第一個元素的迭代器。
end() 返回指向容器最後一個元素所在位置後一個位置的迭代器,通常和 begin() 結合使用。
rbegin() 返回指向最後一個元素的迭代器。
rend() 返回指向第一個元素所在位置前一個位置的迭代器。
cbegin() 和 begin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
cend() 和 end() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crbegin() 和 rbegin() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
crend() 和 rend() 功能相同,只不過在其基礎上,增加了 const 屬性,不能用於修改元素。
size() 返回實際元素個數。
max_size() 返回容器所能容納元素個數的最大值。這通常是一個很大的值,一般是 232-1,我們很少會用到這個函數。
resize() 改變實際元素的個數。
empty() 判斷容器中是否有元素,若無元素,則返回 true;反之,返回 false。
shrink _to_fit() 將內存減少到等於當前元素實際所使用的大小。
at() 使用經過邊界檢查的索引訪問元素。
front() 返回第一個元素的引用。
back() 返回最後一個元素的引用。
assign() 用新元素替換原有內容。
push_back() 在序列的尾部添加一個元素。
push_front() 在序列的頭部添加一個元素。
pop_back() 移除容器尾部的元素。
pop_front() 移除容器頭部的元素。
insert() 在指定的位置插入一個或多個元素。
erase() 移除一個元素或一段元素。
clear() 移出所有的元素,容器大小變爲 0。
swap() 交換兩個容器的所有元素。
emplace() 在指定的位置直接生成一個元素。
emplace_front() 在容器頭部生成一個元素。和 push_front() 的區別是,該函數直接在容器頭部構造元素,省去了複製移動元素的過程。
emplace_back() 在容器尾部生成一個元素。和 push_back() 的區別是,該函數直接在容器尾部構造元素,省去了複製移動元素的過程。

 

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