C STL(3)常用容器介紹(二)deque

2021-10-08 04:36:02 字數 3697 閱讀 1366

vector容器是單向開口的連續記憶體空間,deque則是一種雙向開口的連續線性空間。所謂的雙向開口,意思是可以在頭尾兩端分別做元素的插入和刪除操作,當然,vector容器也可以在頭尾兩端插入元素,但是在其頭部操作效率奇差,無法被接受。

deque容器和vector容器最大的差異,一在於deque允許使用常數項時間對頭端進行元素的插入和刪除操作。二在於deque沒有容量的概念,因為它是動態的以分段連續空間組合而成,隨時可以增加一段新的空間並鏈結起來,換句話說,像vector那樣,」舊空間不足而重新配置一塊更大空間,然後複製元素,再釋放舊空間」這樣的事情在deque身上是不會發生的。也因此,deque沒有必須要提供所謂的空間保留(reserve)功能.

雖然deque容器也提供了random access iterator,但是它的迭代器並不是普通的指標,其複雜度和vector不是乙個量級,這當然影響各個運算的層面。因此,除非有必要,我們應該盡可能的使用vector,而不是deque。對deque進行的排序操作,為了最高效率,可將deque先完整的複製到乙個vector中,對vector容器進行排序,再複製回deque.

deque容器是連續的空間,至少邏輯上看來如此,連續現行空間總是令我們聯想到array和vector,array無法成長,vector雖可成長,卻只能向尾端成長,而且其成長其實是乙個假象,事實上(1) 申請更大空間 (2)原資料複製新空間 (3)釋放原空間 三步驟,如果不是vector每次配置新的空間時都留有餘裕,其成長假象所帶來的代價是非常昂貴的。

deque是由一段一段的定量的連續空間構成。一旦有必要在deque前端或者尾端增加新的空間,便配置一段連續定量的空間,串接在deque的頭端或者尾端。deque最大的工作就是維護這些分段連續的記憶體空間的整體性的假象,並提供隨機訪問的介面,避開了重新配置空間,複製,釋放的輪迴,代價就是複雜的迭代器架構。

deque採取一塊所謂的map(注意,不是stl的map容器)作為主控,這裡所謂的map是一小塊連續的記憶體空間,其中每乙個元素(此處成為乙個結點)都是乙個指標,指向另一段連續性記憶體空間,稱作緩衝區。緩衝區才是deque的儲存空間的主體。

如圖所示:

//預設構造形式

deque

(beg, end)

;//建構函式將[beg, end)區間中的元素拷貝給本身。

deque

(n, elem)

;//建構函式將n個elem拷貝給本身。

deque

(const deque &deq)

;//拷貝建構函式。

;//將[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位置的資料,返回下乙個資料的位置。

C STL常用容器(一)

使用時需要包含標頭檔案 include 1.初始化vector vec 16 定義了已知長度16的vector vector vec 64,2 定義了初值為2長度64的vector vector vec a 用a向量來建立向量 vector vec a.begin i,a.begin j 定義了值為...

C STL常用容器 一

4 4 2019 4 50 15 pm 2 set 集合 3 string 開始時候引入 includeusing namespace std typename 可以是 int double char node vectorname vector陣列 其中 arrayname 0 arrayname...

C STL 常用容器 list

鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動態生成。每個結點包括兩個部分 乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。相較於vector的連續線性空間,l...