咱們經常使用到的STL容器有vector、list、deque、map、multimap、set和multiset,它們究竟有何區別,各自的優缺點是什麼,爲了更好的揚長避短,提升程序性能,在使用以前須要咱們瞭解清楚。
html
vector相似於C語言中的數組,它維護一段連續的內存空間,具備固定的起始地址,於是能很是方便地進行隨機存取,即 [] 操做符,但由於它的內存區域是連續的,因此在它中間插入或刪除某個元素,須要複製並移動現有的元素。此外,當被插入的內存空間不夠時,須要從新申請一塊足夠大的內存並進行內存拷貝。值得注意的是,vector每次擴容爲原來的兩倍,對小對象來講執行效率高,但若是遇到大對象,執行效率就低了。數據庫
list相似於C語言中的雙向鏈表,它經過指針來進行數據的訪問,所以維護的內存空間能夠不連續,這也很是有利於數據的隨機存取,於是它沒有提供 [] 操做符重載。數組
deque相似於C語言中的雙向隊列,即兩端均可以插入或者刪除的隊列。queue支持 [] 操做符,也就是支持隨機存取,並且跟vector的效率相差無幾。它支持兩端的操做:push_back,push_front,pop_back,pop_front等,而且在兩端操做上與list的效率
也差很少。或者咱們能夠這麼認爲,deque是vector跟list的折中。數據結構
map相似於數據庫中的1:1關係,它是一種關聯容器,提供一對一(C++ primer中文版中將第一個譯爲鍵,每一個鍵只能在map中出現一次,第二個被譯爲該鍵對應的值)的數據處理能力,這種特性了使得map相似於數據結構裏的紅黑二叉樹。性能
multimap相似於數據庫中的1:N關係,它是一種關聯容器,提供一對多的數據處理能力。spa
set相似於數學裏面的集合,不過set的集合中不包含重複的元素,這是和vector的第一個區別,第二個區別是set內部用平衡二叉樹實現,便於元素查找,而vector是使用連續內存存儲,便於隨機存取。指針
multiset相似於數學裏面的集合,集合中能夠包含重複的元素。htm
在實際使用過程當中,到底選擇這幾種容器中的哪個,應該根據遵循如下原則:對象
1、若是須要高效的隨機存取,不在意插入和刪除的效率,使用vector;隊列
二、若是須要大量的插入和刪除元素,不關心隨機存取的效率,使用list;
三、若是須要隨機存取,而且關心兩端數據的插入和刪除效率,使用deque;
四、若是打算存儲數據字典,而且要求方便地根據key找到value,一對一的狀況使用map,一對多的狀況使用multimap;
五、若是打算查找一個元素是否存在於某集合中,惟一存在的狀況使用set,不惟一存在的狀況使用multiset。