天天看點

STL容器deque使用STL容器deque使用

STL容器deque使用

deque簡介

deque與vector非常相似。它也采用動态數組來管理元素,提供随機存取,并有着和vector幾乎一模一樣的接口。不同的是deque的動态數組頭尾都開放,是以能在頭尾兩端進行快速安插和删除。

與vector相比,deque功能上的不同在于:

兩端都能快速安插元素和移除元素(vector隻在尾端插入)。這些操作可以在分期攤還的常數時間内完成。

存取元素時,deque的内部結構會多一個間接過程,是以元素的存取和疊代器的動作會稍稍慢一些。

疊代器需要在不同區塊間跳轉,是以必須是特殊的智能型指針,非一般指針。

在對記憶體區塊有所限制的系統中,deque可以内含更多的元素,因為它使用不止一塊記憶體。故deque的max_size()可能更大。

deque不支援對容量和記憶體重配置設定時機的控制。特别注意的是,除了頭尾兩端,在任何地方安插或删除元素,都将導緻指向deque元素的任何pointers、references、iterators失效。不過,deque的記憶體重配置設定優于vectors,因為其内部結構顯示,deuqe不必在記憶體重配置設定時複制所有元素。

deque的記憶體區塊不再被使用時,會被釋放。deque的記憶體大小是可能縮減的。

deque與vector相似特性如下:

在中段部分安插、移除元素的速度相對較慢,因為所有元素都需移動以騰出或填補空間。

疊代器屬于随機存取疊代器。

在以下情形,最好采用deque:

需要在兩端安插和移除元素。

無需引用(refer to)容器内的元素。

要求容器釋放不再使用的元素。

deque基本操作

  • 構造、析構操作

deque c:産生一個空的deque

deque c1(c2):針對某個deque産生同型副本(所有元素都被拷貝)

deque c(n):産生一個deque,含有n個元素,這些元素均勻default構造函數産生出來

deque c(n, elem):産生一個deque,含有n個元素,這些元素均是elem的副本

deque c(beg, end):産生一個deque,以區間[beg; end]内的元素為初值

c.~deque():銷毀所有元素,釋放記憶體

  • 非變動性操作

c.size():傳回容器的實際元素個數

c.empty():判斷容器大小是否為零。等同于size()==0,但可能更快

c.max_size():傳回可容納的最大元素數量

c1 == c2:判斷是否c1等于c2

c1 != c2:判斷是否c1不等于c2。等同于!(c1 == c2)

c1 < c2:判斷是否c1小于c2

c1 > c2:判斷是否c1大于c2。等同于c2 < c1

c1 <= c2:判斷是否c1小于等于c2。等同于!(c2 < c1)

c1 >= c2:判斷是否c1大于等于c2。等同于!(c1 < c2)

c.at(idx):判斷索引idx所标示的元素。如果idx越界,抛出out_of_range

c[idx]:傳回索引idx所标示的元素。不進行範圍檢查

c.front():傳回第一個元素。不檢查元素是否存在

c.back():傳回最後一個元素。不檢查元素是否存在

c.begin():傳回第一個元素。不檢查元素是否存在

c.end():傳回一個随機疊代器,指向第一個元素

c.rbegin():傳回一個逆向疊代器,指向逆向疊代時的第一個元素

c.rend():傳回一個逆向疊代器,指向逆向疊代時的最後元素的下一位置

c1 == c2:将c2的所有元素指派給c1

c.assign(n, elem):将n個elem副本指派給c

c.assign(beg, end):将區間[beg; end]中的元素指派給c

c1.swap(c2):将c1和c2的元素互換

swap(c1, c2):将c1和c2的元素互換

c.insert(pos, elem):在pos位置插入一個elem副本,并傳回新元素的位置

c.insert(pos, n, elem):在pos位置插入elem的n個副本,并無傳回值

c.insert(pos, beg, end):在pos位置插入在區間[beg; end]所有元素的副本,無傳回值

c.push_back(elem):在尾部添加elem的一個副本

c.pop_back():移除最後一個元素(但不回傳)

c.push_front(elem):在頭部插入elem的一個副本

c.pop_front():移除頭部元素(但不回傳)

c.erase(pos):移除pos位置上的元素,傳回下一個元素位置

c.erase(beg, end):移除[beg, end)區間内的所有元素,傳回下一個元素位置

c.resize(num):将大小(元素個數)改為num。如果size()增長了,新增元素都以default構造函數産生出來

c.resize(num, elem):将大小(元素個數)給位num。如果size()增長了,新增元素都是elem的副本

c.clear():移除所有元素,将容器清空

deque的各項操作隻有以下數點和vectors不同:

deque不提供容量操作capacity()和reserve()

deque直接提供函數,用以完成頭部元素的安插和删除(push_front()和pop_front()。

需要考慮如下:

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

元素的插入或删除可能導緻記憶體重新配置設定,是以任何插入或删除動作都會使所有指向deque元素的pointers、references和iterators失效。唯一例外的是在頭部或尾部插入元素,動作之後,pointers和references仍然有效(但iterators沒這麼幸運)。

  • 異常處理

如果已push_back()或push_front()安插元素時發生異常,則該操作不帶來任何效應

pop_back()和pop_front()不會抛出任何異常。

參考文獻:C++标準庫、STL源碼分析