咱們經常使用到的STL容器有vector、list、deque、map、multimap、set和multiset,它們究竟有何區別,各自的優缺點是什麼,爲了更好的揚長避短,提升程序性能,在使用以前須要咱們瞭解清楚。數據庫
優勢:數組
典型的序列容器,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相似於C語言中的雙向鏈表,它經過指針來進行數據的訪問,所以維護的內存空間能夠不連續,這也很是有利於數據的隨機存取,任意元素的訪問、修改時間複雜度是O(n),插入、刪除操做是常數時間複雜度,能夠在任何位置插入新元素。
隊列
缺點:
於是它沒有提供 [] 操做符重載。
deque相似於C語言中的雙向隊列,即兩端均可以插入或者刪除的隊列,內存是連續的,能夠動態縮小空間。queue支持 [] 操做符,也就是支持隨機存取,並且跟vector的效率相差無幾。
它支持兩端的操做:push_back,push_front,pop_back,pop_front等,而且在兩端操做上與list的效率也差很少。或者咱們能夠這麼認爲,deque是vector跟list的折中。
map相似於數據庫中的1:1關係,它是一種關聯容器,提供一對一(C++ primer中文版中將第一個譯爲鍵,每一個鍵只能在map中出現一次,第二個被譯爲該鍵對應的值)的數據處理能力,查找的時間複雜度O(logN),這種特性了使得map相似於數據結構裏的紅黑二叉樹。
和map同樣,區別是鍵能夠重複。multimap相似於數據庫中的1:N關係,它是一種關聯容器,提供一對多的數據處理能力。
set相似於數學裏面的集合,不過set的集合中不包含重複的元素,這是和vector的第一個區別,第二個區別是set內部用平衡二叉樹實現,便於元素查找,而vector是使用連續內存存儲,便於隨機存取。關聯容器,元素不容許有重複,數據被組織成一棵紅黑樹,查找的速度很是快,時間複雜度是O(logN)
multiset相似於數學裏面的集合,集合中能夠包含重複的元素。關聯容器,和set同樣,卻別是容許有重複的元素,具有時間複雜度O(logN)查找功能。
用哪一種容器的選擇看起來很是繁瑣,頭腦中若是有個每一個容器大概的模型,在選擇的時候會更爲輕鬆點。
優勢:
內存和C徹底兼容、高效隨機訪問、節省空間
缺點:
內部插入刪除元素代價巨大、動態大小查過自身容量須要申請大量內存作大量拷貝。
優勢:
任意位置插入刪除元素常量時間複雜度、兩個容器融合是常量時間複雜度
缺點:
不支持隨機訪問、比vector佔用更多的存儲空間
優勢:
高效隨機訪問、內部插入刪除元素效率方便、兩端push pop
缺點:
內存佔用比較高
優勢:
元素會按照鍵值排序、查找是對數時間複雜度、經過鍵值查元素、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提供下標訪問。