1、Vector向量容器數組
連續存儲的容器,動態數組,在堆上分配空間性能
底層實現:數組spa
兩倍容量增加:內存
vector 增長(插入)新元素時,若是未超過當時的容量,則還有剩餘空間,那麼直接添加到最後(插入指定位置),而後調整迭代器。class
若是沒有剩餘空間了,則會從新配置原有元素個數的兩倍空間,而後將原空間元素經過複製的方式初始化新空間,再向新空間增長元素,最後析構並釋放原空間,以前的迭代器會失效。效率
性能:容器
訪問:O(1) 常量時間複雜度配置
插入:在最後插入(空間夠):很快 List
在最後插入(空間不夠):須要內存申請和釋放,以及對以前數據進行拷貝。迭代器
在中間插入(空間夠):內存拷貝(線性時間複雜度)
在中間插入(空間不夠):須要內存申請和釋放,以及對以前數據進行拷貝。
刪除:在最後刪除:很快
在中間刪除:內存拷貝
適用場景:常常隨機訪問,且不常常對非尾節點進行插入刪除。
2、List
動態鏈表,在堆上分配空間,每插入一個元數都會分配空間,每刪除一個元素都會釋放空間。
底層:雙向鏈表
性能:
訪問:隨機訪問性能不好,只能快速訪問頭尾節點。
插入:很快,通常是常數開銷
刪除:很快,通常是常數開銷
適用場景:常常插入刪除大量數據
vector與list 的區別:
1)vector底層實現是數組;list是雙向鏈表。
2)vector支持隨機訪問,list不支持。
3)vector是順序內存,list不是。
4)vector在中間節點進行插入刪除會致使內存拷貝,list不會。
5)vector一次性分配好內存,不夠時才進行2倍擴容;list每次插入新節點都會進行內存申請。
6)vector隨機訪問性能好,插入刪除性能差;list隨機訪問性能差,插入刪除性能好。
應用:
vector擁有一段連續的內存空間,所以支持隨機訪問,若是須要高效的隨即訪問,而不在意插入和刪除的效率,使用vector。
list擁有一段不連續的內存空間,若是須要高效的插入和刪除,而不關心隨機訪問,則應使用list。