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...