STL容器

一、分類

咱們經常使用到的STL容器有vector、list、deque、map、multimap、set和multiset,它們究竟有何區別,各自的優缺點是什麼,爲了更好的揚長避短,提升程序性能,在使用以前須要咱們瞭解清楚。數據庫

二、Verctor

優勢:數組

典型的序列容器,C++標準嚴格要求次容器的實現內存必須是連續的,惟一能夠和標準C兼容的stl容器,任意元素的讀取、修改具備常數時間複雜度,在序列尾部進行插入、刪除是常數時間複雜度,但在序列的頭部插入、刪除的時間複雜度是O(n),能夠在任何位置插入新元素,有隨機訪問功能,能很是方便地進行隨機存取,即 [] 操做符,並且兩個類型相同的vector變量能夠直接作相等操做。
數據結構

缺點:
函數

a、初始化複雜:初始化方式vector<int> a(num) ,生成連續的num個0;vector<int> a(num,10),生成num個10;利用pushback()函數;初始化方式較爲複雜,不能像數組同樣int a[10]={…},進行批量初始化操做;
性能

b、刪除複雜:它維護一段連續的內存空間,具備固定的起始地址,但由於它的內存區域是連續的,因此在它中間插入或刪除某個元素,須要複製並移動現有的元素。
spa

c、不適用於大對象處理:當被插入的內存空間不夠時,須要從新申請一塊足夠大的內存並進行內存拷貝。值得注意的是,vector每次擴容爲原來的兩倍,對小對象來講執行效率高,但若是遇到大對象,執行效率就低了。
指針

d、釋放空間複雜:vector的工做原理是系統預先分配一塊CAPACITY大小的空間,當插入的數據超過這個空間的時候,這塊空間會讓某種方式擴展,可是你刪除數據的時候,它卻不會縮小。vector爲了防止大量分配連續內存的開銷,保持一塊默認的尺寸的內存,clear只是清數據了未清內存,由於vector的capacity容量未變化,系統維護一個的默認值。要內存回收須要更復雜的操做(swap技法就是經過交換函數swap(),使得vector離開其自身的做用域,從而強制釋放vector所佔的內存空間)
對象

三、List

優勢:排序

list相似於C語言中的雙向鏈表,它經過指針來進行數據的訪問,所以維護的內存空間能夠不連續,這也很是有利於數據的隨機存取,任意元素的訪問、修改時間複雜度是O(n),插入、刪除操做是常數時間複雜度,能夠在任何位置插入新元素。
隊列

缺點:

於是它沒有提供 [] 操做符重載。

四、Deque

deque相似於C語言中的雙向隊列,即兩端均可以插入或者刪除的隊列,內存是連續的,能夠動態縮小空間。queue支持 [] 操做符,也就是支持隨機存取,並且跟vector的效率相差無幾。

它支持兩端的操做:push_back,push_front,pop_back,pop_front等,而且在兩端操做上與list的效率也差很少。或者咱們能夠這麼認爲,deque是vector跟list的折中。

五、Map

map相似於數據庫中的1:1關係,它是一種關聯容器,提供一對一(C++ primer中文版中將第一個譯爲鍵,每一個鍵只能在map中出現一次,第二個被譯爲該鍵對應的值)的數據處理能力,查找的時間複雜度O(logN),這種特性了使得map相似於數據結構裏的紅黑二叉樹。

六、Multimap

和map同樣,區別是鍵能夠重複。multimap相似於數據庫中的1:N關係,它是一種關聯容器,提供一對多的數據處理能力。

七、Set

set相似於數學裏面的集合,不過set的集合中不包含重複的元素,這是和vector的第一個區別,第二個區別是set內部用平衡二叉樹實現,便於元素查找,而vector是使用連續內存存儲,便於隨機存取。關聯容器,元素不容許有重複,數據被組織成一棵紅黑樹,查找的速度很是快,時間複雜度是O(logN)

八、Multiset

multiset相似於數學裏面的集合,集合中能夠包含重複的元素。關聯容器,和set同樣,卻別是容許有重複的元素,具有時間複雜度O(logN)查找功能。

九、容器優缺點:

用哪一種容器的選擇看起來很是繁瑣,頭腦中若是有個每一個容器大概的模型,在選擇的時候會更爲輕鬆點。

(1)Vector的數據模型就是數組

優勢:

內存和C徹底兼容、高效隨機訪問、節省空間

缺點:

內部插入刪除元素代價巨大、動態大小查過自身容量須要申請大量內存作大量拷貝。

(2) List的數據結構模型是鏈表

優勢:

任意位置插入刪除元素常量時間複雜度、兩個容器融合是常量時間複雜度

缺點:

不支持隨機訪問、比vector佔用更多的存儲空間

(3)Deque的數據模型是數組和鏈表的折衷

優勢:

高效隨機訪問、內部插入刪除元素效率方便、兩端push pop

缺點:

內存佔用比較高

(4) Map、set、multimap、multiset的數據結構模型是二叉樹(紅黑樹)

優勢:

元素會按照鍵值排序、查找是對數時間複雜度、經過鍵值查元素、map提供了下標訪問

十、使用原則

1)若是須要隨機訪問,用vector;

2)若是存儲元素的數目已知,用vector;

3)須要任意位置隨機插入刪除,用list;

4)只有須要更多在容器的首部尾部插入刪除元素,用deque;

5)元素是複雜結構用list,也能夠用vector存儲指針(須要額外的精力去維護內存),看需求;

6)若是操做是基於鍵值,用set map;

7)若是須要常常的搜索,用map set;

8) map set的區別是map中的元素都是pair<key, value>,同時map提供下標訪問。

相關文章
相關標籤/搜索