vector與list的區別

2021-10-05 19:54:08 字數 1153 閱讀 4254

1、vector

vector的底層實現是陣列,它擁有一段連續的記憶體空間,並且起始位址不變,因此訪問的效率較高。由於他的記憶體空間是連續的,所以在中間進行插入和刪除的操作時,會造成記憶體塊的拷貝,在空間不夠的情況下,需要申請一塊最夠大的記憶體並進行記憶體的拷貝,也是基於這也原因,在vetcor的插入和刪除是會造成迭代器失效,

vector的迭代器失效問題:在插入元素的時候,若是記憶體空間不夠,需要進行擴容,而增容後的pos還是指向原來的空間,但是原來的空間已經釋放,這就會導致迭代器失效;(解決辦法: 在插入前計算出相對的起始位置的相對距離,那麼當插入時候用計算的距離還原pos進行插入)

在刪除元素的時候,假設刪除pos處的元素,然後再訪問pos處的元素,此時是無法訪問的,這就會導致迭代器失效。(解決辦法: 使用返回值,返回刪除後原來的位置。用到的時候,當刪除後接收返回的迭代器。)

2、list

list的底層實現是雙向鍊錶,所以他的記憶體空間是不連續的,因此list的訪問的效率比較低,但是基於鍊錶的特性,list的插入和刪除的效率非常高。

list的迭代器失效問題:list的插入不會導致迭代器失效,但是刪除節點會導致迭代器失效,假設刪除pos出的元素,迭代器++就會失效,因為需要通過當前結點來找到下乙個結點的,當前結點已經釋放,通過迭代器++就會失效(解決辦法: 在實現erase的時候會返回刪除後的後面的元素的迭代器。)

3、vector與list的區別

(1)vector 的底層實現是陣列,而list的底層實現是雙向鍊錶

(2)vector支援隨機訪問,而list不支援隨機訪問

(3)vector是順序記憶體,而list不是

(4)vector在中間進行插入刪除元素時,會導致記憶體拷貝,而list不會

(5)vector是一次分配好記憶體,不夠時再進行2倍擴容,而list每次插入新結點都會進行記憶體申請

(6)vector的隨機訪問效能好,但是插入刪除的效能不好,而list 不支援隨機訪問,但是插入和刪除元素的效能好

4、應用場景

若是需要高效的隨機訪問,不在乎插入刪除的效率,使用vector

若是需要高效的插入和刪除,而不在乎隨機訪問,使用list

vector與list的區別

vector與list差異點與優缺點 1 vector動態增長 不是隨著每個元素的插入而自己增長的。預先存了一些儲存區,使得實際分配的空間比當前所需的空間多一些,而list 表示非連續的記憶體區域,並通過一對指向首位元素的指標雙向鏈結起來,因而可以兩個方向進行遍歷。2 當從vector末端刪除元素的...

vector與list的區別

vector 連續儲存的容器,動態陣列,在堆上分配空間 底層實現 陣列 兩倍容量增長 vector 增加 插入 新元素時,如果未超過當時的容量,則還有剩餘空間,那麼直接新增到最後 插入指定位置 然後調整迭代器。如果沒有剩餘空間了,則會重新配置原有元素個數的兩倍空間,然後將原空間元素通過複製的方式初始...

vector與list的區別

vector為儲存的物件分配一塊連續的位址空間,因此對vector中的元素隨機訪問效率很高。在vecotor中插入或者刪除某個元素,需要將現有元素進行複製,移動。如果vector中儲存的物件很大,或者建構函式複雜,則在對現有元素進行拷貝時開銷較大,因為拷貝物件要呼叫拷貝建構函式。對於簡單的小物件,v...