STL 容器型別

2021-06-21 13:32:31 字數 3558 閱讀 9183

1. stl有6種序列容器型別 

1 vector

向量 相當於乙個陣列

在記憶體中分配一塊連續的記憶體空間進行儲存。支援不指定vector大小的儲存。stl內部實現時,首先分配乙個非常大的記憶體空間預備進行儲存,即capacituy()函式返回的大小,當超過此分配的空間時再整體重新放分配一塊記憶體儲存,這給人以vector可以不指定vector即乙個連續記憶體的大小的感覺。通常此預設的記憶體分配能完成大部分情況下的儲存。

優點:(1) 不指定一塊記憶體大小的陣列的連續儲存,即可以像陣列一樣操作,但可以對此陣列

進行動態操作。通常體現在push_back() pop_back()

(2) 隨機訪問方便,即支援[ ]操作符和vector.at()

(3) 節省空間。

缺點:(1) 在內部進行插入刪除操作效率低。

(2) 只能在vector的最後進行push和pop,不能在vector的頭進行push和pop。

(3) 當動態新增的資料超過vector預設分配的大小時要進行整體的重新分配、拷貝與釋放

push_back add element at the end (public member function)

pop_back delete last element (public member function)

insert insert elements (public member function)

erase erase elements (public member function )

清空clear();

注意,clear()和resize()都不一定使得vector變小,若欲釋放記憶體,請使用vecobj.swap(vector())

2 list

雙向鍊錶

每乙個結點都包括乙個資訊快info、乙個前驅指標pre、乙個後驅指標post。可以不分配必須的記憶體大小方便的進行新增和刪除操作。使用的是非連續的記憶體空間進行儲存。

優點:(1) 不使用連續記憶體完成動態操作。

(2) 在內部方便的進行插入和刪除操作

(3) 可在兩端進行push、pop

缺點:(1) 不能進行內部的隨機訪問,即不支援[ ]操作符和vector.at()

(2) 相對於verctor占用記憶體多

push_front insert element at beginning (public member function)

pop_front delete first element (public member function)

push_back add element at the end (public member function)

pop_back delete last element (public member function)

insert insert elements (public member function)

erase erase elements (public member function)

list沒有空間預留習慣,所以每分配乙個元素都會從記憶體中分配,每刪除乙個元素都會釋放它占用的記憶體。list在**新增刪除元素效能都很高,不需要移動記憶體,當然也不需要對每個元素都進行構造與析構了,所以常用來做隨機操作容器與vector不同是,當向容器中插入或刪除元素後,鍊錶迭代器指向元素將不變。 如果乙個vector有5個元素,中間插入乙個,那麼第五個元素包含的值將是以前第四個元素的值,因此,迭代器指向的位置不變,但是資料不同。然而,在鍊錶中插入新元素並不會移動已有的元素,而只是修改鏈結資訊。 指向某個元素的迭代器仍然指向該元素,也就是值相同,鏈結的位置不同了。 

3 deque

雙端佇列 double-end queue

deque是在功能上合併了vector和list,看起來像是list和vector的結合品。

優點:(1) 隨機訪問方便,即支援[ ]操作符和vector.at()

(2) 在內部方便的進行插入和刪除操作

(3) 可在兩端進行push、pop

缺點:(1) 占用記憶體多

push_back add element at the end (public member function)

push_front insert element at beginning (public member function)

pop_back delete last element (public member function)

pop_front delete first element (public member function)

insert insert elements (public member function)

erase erase elements (public member function)

在標準庫中vector和deque提供幾乎相同的介面,在結構上它們的區別主要在於這兩種容器在組織記憶體上不一樣,deque是按頁或塊來分配儲存器 的,每頁包含固定數目的元素.相反vector分配一段連續的記憶體,vector只是在序列的尾段插入元素時才有效率,而deque的分頁組織方式即使在 容器的前端也可以提供常數時間的insert和erase操作,而且在體積增長方面也比vector更具有效率。deque在開始和最後新增元素都一樣快,並提供了隨機訪問方法,像vector一樣使用訪問任意元素,但是隨機訪問速度比不上vector快,因為它要內部處理堆跳轉。

使用區別:

1 如果你需要高效的隨即訪問,而不在乎插入和刪除的效率,使用vector 

2 如果你需要大量的插入和刪除,而不關心隨即訪問,則應使用list 

3 如果你需要隨即訪問,而且關心兩端資料的插入和刪除,則應使用deque

4 queue 

queue是乙個介面卡類,底層類預設為deque。 它不允許隨機訪問佇列元素,甚至不允許遍歷佇列。可以將元素新增到隊尾,檢視隊尾和隊首的元素的值,檢查元素數目和測試佇列是否為空。 

5 priority_queue 

與queue的不同是,最大的元素總是在隊首,也是乙個介面卡類,預設的底層類是vector。 

可以修改用於確定哪個元素放在隊首的比較方式,方法是提供乙個可選的構造函式引數。 

6 stack 

也是乙個介面卡類,預設的底層實現為vector。 不允許隨機訪問堆疊元素,甚至不允許遍歷堆疊。可以壓入到棧頂,從棧頂彈出元素,檢視棧頂元素的值,檢查元素數目和測試堆疊是否為空。 

2. stl有4種聯合容器:set,multiset, map, multimap

聯合容器將值與關鍵字關聯在一起,使用關鍵字來查詢值。 

關聯容器的長處在於,它提供了對元素的快速訪問。 與序列相似,聯合容器也允許插入新元素,不過不能指定元素的插入位置。原因是聯合容器通常包含用於確定資料存放位置的演算法,以便能夠很快檢索資訊。 

1 set,multiset 

前兩種是在set標頭檔案中(以前分別為set.h和multiset.h); 

值的型別與關鍵字相同。 set刪除相同的元素,multiset不會。 

2 map,multimap 

後兩種是在map標頭檔案中(以前分別為map.h和multimap.h)。 

值的型別與關鍵字不同。 map關鍵字唯一,multimap關鍵字不唯一。

STL 容器型別

1.stl有6種序列容器型別 1 vector 向量 相當於乙個陣列 在記憶體中分配一塊連續的記憶體空間進行儲存。支援不指定vector大小的儲存。stl內部實現時,首先分配乙個非常大的記憶體空間預備進行儲存,即capacituy 函式返回的大小,當超過此分配的空間時再整體重新放分配一塊記憶體儲存,...

STL容器型別

1.stl有6種序列容器型別 1 vector 它提供對元素的隨即訪問,在尾部新增和刪除元素的時間是固定的,在頭部或中部插入和刪除元素的複雜度為線性時間。2 deque 在檔案中宣告。是雙端佇列,支援隨即訪問。從deque的開始與末尾位置插入和刪除元素的時間是固定的。儘管vector和deque都提...

C 容器(STL容器)

容器 container 用於存放資料的類模板。可變長陣列 鍊錶 平衡二叉樹等資料結構在stl中都被實現為容器。在使用容器時,即將容器類模型例項化為容器類,會指明容器中存放的元素是什麼型別。容器可以分為兩大類 順序容器和關聯容器 順序容器有可變長動態陣列vector 雙端佇列deque 雙向鍊錶li...