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() 的區別是,該函數直接在容器尾部構造元素,省去了複製移動元素的過程。 |