vector和list的區別 新增迭代器

2021-09-29 13:30:26 字數 1159 閱讀 6326

第一步 給迭代器 封裝乙個類

1構造類中實現什麼方法就要看使用的時候需要什麼。

一般情況下像向著指標方向想,指標能做什麼,迭代器就得實現什麼的過載。

operator != /operator ==

operator * /operator ->

operator ++ operator–(這兩個視情況而定,就向for_ward list 單鏈表(單向的) ,只能有乙個 operator++)

第二步 取別名,盡量統一取別名為iterator(不同型別 迭代器型別實際不同)

第三步 類中增加:begin()和end()方法

(list中)正反向迭代器起始位置是相同的,都在head這裡,單列印順序是相反的

迭代器失效

list的迭代器失效 只會發生在刪除節點的時候,這是要注意將此位置的迭代器在刪除前備份乙份,或者直接(it++)這種刪除

1 vector 底層連續 list底中層不一定連續,list底層通過指標相互連線

2 vector 可以支援隨機訪問時間複雜度o(1),list 需要進行遍歷,時間複雜度為o(n)

3 vector 大小動態變化,可能需要擴容,list 沒有固定大小 即不需要擴容,

4.空間利用率不同,vector可能會導致記憶體碎片,一般情況下vector利用率高。因為list需要存前後指標,需要存元素,這個問題比較複雜,

因為擴容的時候就不好說了,不同的版本下擴容的機制不同,vs 1.5倍 ,g++位2倍 ,這時候誰的利用率高就不好說了。

5 vector申請空間可能增容,list不牽扯增容問題,因為它是迴圈的雙向鍊錶,

6 vector 隨機位置插入或刪除,需要搬移元素時間複雜度為o(n),但是list隨機位置插入的時候時間複雜度為o(1)

7 迭代器不同 vector迭代器為原生態的指標,list是對原生態指標的封裝。(因為list的迭代器可能是任意自定義型別)

8 迭代器失效場景不同,vector在增容或者刪除(erase)某個元素時會失效,但list只是當前結點迭代器失效

9 介面不同 resize() reserve vector有,list沒有,list有頭插頭刪push_front pop_front,vector沒有這個方法,但是可以通過insert實現

list和vector的區別

vector和built in陣列類似,它擁有一段連續的記憶體空間,並且起始位址不變,因此它能夠非常好的支援隨機訪問,即操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝。另外,當該陣列後的記憶體空間不夠時,需要重新申請一塊足夠大的記憶體並進行記憶體的拷貝。這些都大大...

vector和list的區別

1.vector資料結構 vector和陣列類似,擁有一段連續的記憶體空間,並且起始位址不變。因此能高效的進行隨機訪問,時間複雜度為o 1 但因為記憶體空間是連續的,所以在進行插入和刪除操作時,會造成記憶體塊的拷貝,時間複雜度為o n 另外,當陣列中記憶體空間不夠時,會重新申請一塊記憶體空間並進行記...

list和vector的區別

vector和動態陣列類似,擁有一段連續的記憶體空間,能高效的進行隨機訪問,時間複雜度為o 1 但在進行插入和刪除操作時,會造成記憶體塊的拷貝,時間複雜度為o n 2.list資料結構 list是由雙向鍊錶實現的,記憶體空間是不連續的。訪問資料時間複雜度為o n 但能高效地進行插入和刪除。已知元素是...