小結
我們常用到的stl容器有vector、list、deque、map、multimap、set和multiset,它們究竟有何區別,各自的優缺點是什麼,為了更好的揚長避短,提高程式效能,在使用之前需要我們了解清楚。
verctor
vector類似於c語言中的陣列,它維護一段連續的記憶體空間,具有固定的起始位址,因而能非常方便地進行隨機訪問,即 操作符,但因為它的記憶體區域是連續的,所以在它中間插入或刪除某個元素,需要複製並移動現有的元素。此外,當被插入的記憶體空間不夠時,需要重新申請一塊足夠大的記憶體並進行記憶體拷貝。值得注意的是,vector每次擴容為原來的兩倍,對小物件來說執行效率高,但如果遇到大物件,執行效率就低了。
list
list類似於c語言中的雙向鍊錶,它通過指標來進行資料的訪問,因此維護的記憶體空間可以不連續,這也非常有利於資料的隨機訪問,因而它沒有提供 操作符過載。
deque
deque類似於c語言中的雙向佇列,即兩端都可以插入或者刪除的佇列。queue支援 操作符,也就是支援隨機訪問,而且跟vector的效率相差無幾。它支援兩端的操作:push_back,push_front,pop_back,pop_front等,並且在兩端操作上與list的效率
也差不多。或者我們可以這麼認為,deque是vector跟list的折中。
map
map類似於資料庫中的1:1關係,它是一種關聯容器,提供一對一(c++ primer中文版中將第乙個譯為鍵,每個鍵只能在map中出現一次,第二個被譯為該鍵對應的值)的資料處理能力,這種特性了使得map類似於資料結構裡的紅黑二叉樹。
multimap
multimap類似於資料庫中的1:n關係,它是一種關聯容器,提供一對多的資料處理能力。
set
set類似於數學裡面的集合,不過set的集合中不包含重複的元素,這是和vector的第乙個區別,第二個區別是set內部用平衡二叉樹實現,便於元素查詢,而vector是使用連續記憶體儲存,便於隨機訪問。
multiset
multiset類似於數學裡面的集合,集合中可以包含重複的元素。
小結
在實際使用過程中,到底選擇這幾種容器中的哪乙個,應該根據遵循以下原則:
1、如果需要高效的隨機訪問,不在乎插入和刪除的效率,使用vector;
2、如果需要大量的插入和刪除元素,不關心隨機訪問的效率,使用list;
3、如果需要隨機訪問,並且關心兩端資料的插入和刪除效率,使用deque;
4、如果打算儲存資料字典,並且要求方便地根據key找到value,一對一的情況使用map,一對多的情況使用multimap;
5、如果打算查詢乙個元素是否存在於某集合中,唯一存在的情況使用set,不唯一存在的情況使用multiset。
STL各種容器的區別
容器名名稱 資料結構 效能備註 string 通用字串庫 連續存放的記憶體塊 有保留記憶體 堆中分配記憶體 高效率的隨機訪問 o 1 的訪問時間 在最後增加元素時,一般不需要分配記憶體空間,速度快 在中間或開始操作元素時要進行記憶體拷貝效率低 支援操作 vector 通用向量 陣列 庫 變長一維陣列...
STL幾種容器的區別簡介
有黑必有白,世界萬物都是成對出現的。鍊錶對於陣列來說就是相反的存在。陣列本身是沒有動態增長能力的 程式中也必須重新開闢記憶體來實現 而鍊錶強悍的就是動態增長和刪除的能力。但對於陣列強悍的隨機訪問能力來說的話,鍊錶卻很弱。list是乙個雙向鍊錶的實現。為了提供雙向遍歷的能力,list要比一般的資料單元...
C 中STL常用容器的區別
我們常用到的stl 容器有vector list deque map multimap set和multiset,它們究竟有何區別,各自的優缺點是什麼,為了更好的揚長避短,提高程式效能,在使用之前需要我們了解清楚。vector類似於c語言中的陣列,它維護一段連續的記憶體空間,具有固定的起始位址,因而...