STL vector與list的區別

2021-06-20 03:58:01 字數 849 閱讀 1478

標準庫定義了三種順序容器型別:vector、list和deque(雙端佇列double-end-queue),他們的差別在於訪問元素的方式以及對容器進行插入、刪除等相關操作的執行代價不同。   

vector      支援快速隨機訪問

list 支援快速插入、刪除

deque 雙端佇列

vector是順序儲存,其位址空間是連續的,對其進行插入、刪除操作會引起記憶體的拷貝與移動。在中間插入(或刪除)元素,其後面的元素都要移動,如果該快記憶體後面的剩餘空間不足以儲存插入的元素還會造成整個容器的拷貝,vector每次擴充套件容量時是擴充套件capacity的整數倍(對於小物件來說效率比較高)。如果儲存的是複雜資料型別,拷貝建構函式又比較複雜的話,vector的插入和刪除操作的執行代價是非常大的。另外,因為vector是順序儲存,因此支援下標訪問,隨機訪問效率較高。

list類似於資料結構的雙向鍊錶,其位址空間是不連續的,通過指標來進行資料的訪問。list的插入刪除不會引起其他資料元素記憶體的拷貝,只是指標的變化。list支援在容器的任意位置高效的插入和刪除。

(無論是對於vector還是deque,插入和刪除都會引起部分或全部迭代器的失效。)

vector和deque的迭代器支援自增 自減運算以及其它算數運算

list的迭代器不支援算數運算,只支援自增 自減運算,因此對於乙個list的迭代器:

listlist1;

list::iterator iter = list.begin();

iter = iter + 3; //error ,但是同樣的操作對於vector是正確的

iter++; //ok

STL vector與陣列的互轉

c stl庫中vector素有動態陣列的美譽,為什麼?我想有以下幾個原因 1 它能夠彌補普通陣列 如 int a 8 只能固定長度的缺陷 2 它能彌補一般堆陣列 如int p new int n 需要預先知道長度,並且長度不可變的缺陷。在有些情況下,比如從檔案中讀取一組未知長度的float型的資料。...

stl vector 容量與大小之間的關係

當對vector進行push back等操作的時候,當超出之前記憶體所分配的部分之後,需要新增記憶體空間存放更多元素。將原來的資料複製過來,釋放之前的記憶體,然後插入新增加的元素 那麼這個過程是怎麼樣的呢?我們用 來試一下 vs2013環境下如下 include includeusing names...

STLvector的記憶體問題

讀 資料結構預算法分析c 描述 人民郵電p54問題?vector類內部儲存查得資料 轉侵刪。用於自己學習 在stl的容器中,vector可以說是最容易理解和使用的容器了,以前使用陣列的時候,如果不確定有多少資料要儲存,就會預先分配乙個大的陣列,如果實際沒有用到那麼多,又會浪費很多的記憶體資源,如果不...