C++ vector,list,deque區別

來源:互聯網
上載者:User

標籤:複用   地址空間   deque   完全   tail   關聯   follow   刪除元素   ima   

    在寫C++程式的時候會發現STL是一個不錯的東西,減少了代碼量,使代碼的複用率大大提高,減輕了程式猿的負擔。還有一個就是容器,你會發現要是自己寫一個鏈表、隊列,或者是數組的時候,既要花時間還要操心怎麼去維護,裡面的指標啊,記憶體夠不夠用啊,長度問題,有沒有可能溢出啊等等一系列的問題等著我們去解決,還是比較頭疼的。所以容器的出現解決了這一個問題,它將這些資料結構都封裝成了一個類,只需要加上標頭檔,我們就可以輕鬆的應用,不用那麼複雜,就連指標也被封裝成了迭代器,用起來更方便,更人性化,方便了我們的編程,對於程式員來說還是一大福音!!

          C++中的容器類包括“順序儲存結構”和“關聯儲存結構”,前者包括vector,list,deque等;後者包括set,map,multiset,multimap等。若需要儲存的元素數在編譯器間就可以確定,可以使用數組來儲存,否則,就需要用到容器類了。

1.vector
    連續儲存結構,每個元素在記憶體上是連續的支援高效的隨機訪問和在尾端插入/刪除操作但其他位置的插入/刪除操作效率低下;相當於一個數組,但是與數組的區別為:記憶體空間的擴充。vector支援不指定vector大小的儲存,但是數組的擴充需要程式員自己寫。
    vector的記憶體配置實現原理:
    STL內部實現時,首先分配一個非常大的記憶體空間預備進行儲存,即capacity()函數返回的大小,當超過此分配的空間時再整體重新放分配一塊記憶體儲存(VS6.0是兩倍,VS2005是1.5倍),所以這給人以vector可以不指定vector即一個連續記憶體的大小的感覺。通常此預設的記憶體配置能完成大部分情況下的儲存。
    擴充空間(不論多大)都應該這樣做:
   (1)配置一塊新空間
   (2)將舊元素一一搬往新址
   (3)把原來的空間釋放還給系統
    註:vector 的資料安排以及操作方式,與array 非常相似。兩者的唯一差別在於空間的利用的靈活性。Array 的擴充空間要程式員自己來寫。
    vector類定義了好幾種建構函式,用來定義和初始化vector對象:
    vector<T>  v1;  vector檔案類型為T的對象。預設建構函式v1為空白。
    vector<T> v2(v1);  v2是v1的一個副本。
    vector<T> v3(n, i);  v3包含n個值為i的元素。
    vector<T> v4(n);   v4含有值初始化的元素的n個副本。
2.deque
    連續儲存結構,即其每個元素在記憶體上也是連續的,類似於vector,不同之處在於,deque提供了兩級數組結構, 第一級完全類似於vector,代表實際容器;另一級維護容器的首位地址。這樣,deque除了具有vector的所有功能外,還支援高效的首/尾端插入/刪除操作
    deque   雙端隊列 double-end queue
    deque是在功能上合并了vector和list。
    優點: (1) 隨機訪問方便,即支援[ ]操作符和vector.at()
                (2) 在內部方便的進行插入和刪除操作
                (3) 可在兩端進行push、pop
    缺點:佔用記憶體多
3.list
    非連續儲存結構具有雙鏈表結構,每個元素維護一對前向和後向指標,因此支援前向/後向遍曆。支援高效的隨機插入/刪除操作,但隨機訪問效率低下,且由於需要額外維護指標,開銷也比較大。每一個結點都包括一個資訊快Info、一個前驅指標Pre、一個後驅指標Post。可以不分配必須的記憶體大小方便的進行添加和刪除操作。使用的是非連續的記憶體空間進行儲存。
   優點: (1) 不使用連續記憶體完成動態操作。
               (2) 在內部方便的進行插入和刪除操作
               (3) 可在兩端進行push、pop
   缺點: (1) 不能進行內部的隨機訪問,即不支援[ ]操作符和vector.at()
               (2) 相對於verctor佔用記憶體多
   使用區別:
             (1)如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector
             (2)如果你需要大量的插入和刪除,而不關心隨機存取,則應使用list
             (3)如果你需要隨機存取,而且關心兩端資料的插入和刪除,則應使用deque
4.vector VS. list VS. deque:
    a、若需要隨機訪問操作,則選擇vector;
    b、若已經知道需要儲存元素的數目,則選擇vector;
    c、若需要隨機插入/刪除(不僅僅在兩端),則選擇list
    d、只有需要在首端進行插入/刪除操作的時候,還要兼顧隨機訪問效率,才選擇deque,否則都選擇vector。
    e、若既需要隨機插入/刪除,又需要隨機訪問,則需要在vector與list間做個折中-deque。
    f、當要儲存的是大型負責類對象時,list要優於vector;當然這時候也可以用vector來儲存指向對象的指標,
       同樣會取得較高的效率,但是指標的維護非常容易出錯,因此不推薦使用。

問題一:list和vector的區別:
(1)vector為儲存的對象分配一塊連續的地址空間,隨機訪問效率很高。但是插入和刪除需要移動大量的資料,效率較低。尤其當vector中儲存
的對象較大,或者建構函式複雜,則在對現有的元素進行拷貝的時候會執行拷貝建構函式。
(2)list中的對象是離散的,隨機訪問需要遍曆整個鏈表,訪問效率比vector低。但是在list中插入元素,尤其在首尾插入,效率很高,只需要改變元素的指標。

(3)vector是單向的,而list是雙向的

(4)向量中的iterator在使用後就釋放了,但是鏈表list不同,它的迭代器在使用後還可以繼續用;鏈表特有的;

問題二:deque和vector的區別:

(1)兩端都能夠快速插入和刪除元素。vector只能在尾端進行。

(2)deque的元素存取和迭代器操作會稍微慢一些。因為deque的內部結構會多一個間接過程。

(3)迭代器是特殊的智能指標,而不是一般指標。它需要在不同的區塊之間跳轉。

(4)因為deque使用不止一塊記憶體(而vector必須使用一塊連續記憶體),所以deque的max_size()可能更大

(5)不支援對容量和記憶體配置時機的控制。

注意:在除了首尾兩端的其他地方插入和刪除元素,都將會導致指向deque元素的任何pointers、references、iterators失效。不過,deque的記憶體重分配優於vector。因為其內部結構顯示不需要複製所有元素。

6、deque的記憶體區塊不再被使用時,會被釋放。deque的記憶體大小是可縮減的。不過,是不是這麼做以及怎麼做由實作版本定義。

題三:常量容器const
     const vector<int> vec(10);//這個容器裡capacity和size和值都是不能改變的,const修飾的是vector;
     迭代器:const vector<int>::const_iterrator ite; //常量迭代器;
      註:const vector <int> vec(10) —— 與const int a[10]是一回事,意思是vec只有10個元素,不能增加了,裡面的元素也是不能變化的

vector<int> a(10);const vector<int> b(10);a[1]=10;//正確b[1]=10;//錯誤a.resize(20);//正確b.resize(20);//錯誤

問題四:capacity V.S size
    a、capacity是容器需要增長之前,能夠盛的元素總數;只有連續儲存的容器才有capacity的概念(例如vector,deque,string),list不需要capacity。
    b、size是容器當前儲存的元素的數目。
    c、vector預設的容量初始值,以及增長規則是依賴於編譯器的。
問題五:用vector儲存自訂類對象時,自訂類對象須滿足:
    a、有可供調用的無參建構函式(預設的或自訂的);

    b、有可用的拷貝賦值函數(預設的或自訂的)

問題六:迭代器iterator

     a、vector與deque的迭代器支援算術運算,list的迭代器只能進行++/--操作,不支援普通的算術運算。

     b .向量中的iterator在使用後就釋放了,但是鏈表list不同,它的迭代器在使用後還可以繼續用;鏈表特有的;

C++ vector,list,deque區別(轉)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.