c 標準庫之容器

2022-07-13 06:12:11 字數 1222 閱讀 1192

c++最原始的容器之一是陣列。陣列的特點有:

1.大小固定

2.單獨存在的陣列建立在棧上,作為物件成員存在的陣列建立在堆上還是棧上則要看作為宿主物件是被建立在堆上還是棧上。棧空間是有限的,所以如果陣列在棧上,則不能容納太多元素,否則會導致stack overflow。

c++最原始的容器之二則是用乙個指標指向從堆上申請的一塊連續的記憶體。它的特點有:

1.大小固定

2.因其建立在堆上,所以容器大小不受棧大小的限制,可以很大。

陣列在使用上有諸多不遍,如求陣列長度,得sizeof(陣列)/sizeof(元素),而且陣列不支援賦值、交換、比較,所以就有了array。array是對陣列的包裝,對其繫結了一些常用的操作,使其用起來更順手。理論上來說,因為多了一層包裝,時間效率會低一點,但編譯器優化後就沒區別了。所以array是改良的陣列,但它還是保留了陣列的所有特點:大小固定,而且要小心stack overflow。

vector

array是對陣列的包裝,vector則是對指標的包裝。vector去掉了基本容器大小固定的特點,當申請的堆記憶體不夠存放新的元素後,vector會申請一塊更大的記憶體來儲存元素,然後釋放掉舊的記憶體。vector相對於陣列、指標、array來說是功能最強大、最普適的容器,但同時也是訪問效率最低的。

vector是一塊連續的記憶體,因此只有在尾部進行插入、刪除才高效,其它位置都要進行move操作。vector的記憶體增長時也會導致舊記憶體上的元素都要move一遍。而且vector的記憶體大小只增不減。deque採用多塊連續記憶體的機制,在頭部、尾部都可以高效的插入、刪除。而且deque的記憶體大小能根據元素多少而動態增長、縮減,同時內存在增長的時候也不會把所有元素都move一遍。但deque的訪問時間效率要比vector低很多了。

陣列、指標、array、vector、deque都支援通過下標隨機訪問元素,list本質上是雙向鍊錶,所以不支援下標訪問。但list的優點在於在任何位置插入、刪除都是常量時間,除頭尾外,比vector、deque要高效。

forward_list本質上是單向鍊錶,設計初衷是為了省空間(連size函式都省了)。forward_list不支援下標訪問,操作方式也與其它的容器不同,vector、list的insert、erase操作都是刪除iterator所指的元素,而forward_list則是刪除iterator所指元素之後的元素。

關聯容器,set對應的概念為集合,其優點在於可快速查詢。

關聯容器,map對應的概念為字典表,其優點也在於可快速查詢。

C 標準庫之關聯容器 C Primer

map multimap set multiset 關聯容器是通過紅黑樹來實現的。1 關聯容器的初始化 2 關鍵字型別的要求 3 pair型別 定義在utility標頭檔案中,含有first和second兩個public資料成員 4 關聯容器的操作 4.1 關聯容器額外的型別別名 4.2 新增元素 ...

C 標準庫關聯容器

1 關聯容器定義 儲存物件集合的型別,支援通過鍵的高效訪問。和順序容器的本質差別在於 順序容器通過元素在容器中的位置順序儲存和訪問元素,而關聯容器卻是依靠鍵。map和set是兩個基本的關聯容器型別,map以鍵值對的形式組織儲存元素,而set僅儲存鍵。2,pair型別 在utility標頭檔案中定義 ...

C 標準庫 順序容器

二 容器的選擇 三 容器的操作 容器就是特定型別物件的集合。順序容器為程式設計師提供了控制元素儲存和訪問順序的能力,這種順序不依賴於元素的值,而是與元素加入容器時的位置相對應。相比於陣列,它可以很隨意的實現元素的新增 刪除等,我們也無需擔心記憶體分配的問題。要使用容器,必須包含相應的標頭檔案 inc...