1. 程式人生 > >c++中list和vector的比較

c++中list和vector的比較

面試中經常會被問到的這個問題,所以順道在這裡去總結一下:

首先

list

1.list是由雙向連結串列實現的,因此記憶體空間是不連續的。
2.只能通過指標訪問資料,所以list的隨機存取非常沒有效率,時間複雜度為o(n);
3.但由於連結串列的特點,能高效地進行插入和刪除。

vector

1.vector和陣列類似,擁有一段連續的記憶體空間,並且起始地址不變。
   因此能高效的進行隨機存取,時間複雜度為o(1);


2.但因為記憶體空間是連續的,所以在進行插入和刪除操作時,會造成記憶體塊的拷貝,時間複雜度為o(n)。
另外,當陣列中記憶體空間不夠時,會重新申請一塊記憶體空間並進行記憶體拷貝。

區別為:

STL中,容器vector和list都可以用來存放一組型別相同的資料。不同於陣列的一點是,他們都支援動態增長。不同點為:

(1)  vector是順序表,表示的是一塊連續的記憶體,元素被順序儲存;list是雙向連線表,在記憶體中不一定連續。

(2)當數值記憶體不夠時,vector會重新申請一塊足夠大的連續記憶體,把原來的資料拷貝到新的記憶體裡面;list因為不用考慮記憶體的連續,因此新增開銷比vector小。

(3)list只能通過指標訪問元素,隨機訪問元素的效率特別低,在需要頻繁隨機存取元素時,使用vector更加合適。

(4)當向vector插入或者刪除一個元素時,需要複製移動待插入元素右邊的所有元素;因此在有頻繁插入刪除操作時,使用list更加合適。

總結:

需要高效的隨機存取,而不在乎插入和刪除的效率,使用vector;
如果需要大量的插入和刪除,而不關心隨機存取,則應使用list。