1. 程式人生 > >C++中陣列、連結串列和vector等容器之間的區別

C++中陣列、連結串列和vector等容器之間的區別

這裡寫圖片描述

1. 各個容器之間區別

① vector
  (連續的空間儲存,可以使用[]操作符)快速的訪問隨機的元素,快速的在末尾插入元素,但是在序列中間歲間的插入,刪除元素要慢,而且如果一開始分配的空間不夠的話,有一個重新分配更大空間,然後拷貝的效能開銷。

② deque
  (小片的連續,小片間用連結串列相連,實際上內部有一個map的指標,因為知道型別,所以還是可以使用[],只是速度沒有vector快)快速的訪問隨機的元素,快速的在開始和末尾插入元素,隨機的插入,刪除元素要慢,空間的重新分配要比vector快,重新分配空間後,原有的元素不需要拷貝。對deque的排序操作,可將deque先複製到vector,排序後在複製回deque。

③ list
  (每個元素間用連結串列相連)訪問隨機元素不如vector快,隨機的插入元素比vector快,對每個元素分配空間,所以不存在空間不夠,重新分配的情況

④ set
  內部元素唯一,用一棵平衡樹結構來儲存,因此遍歷的時候就排序了,查詢也比較快的哦。
⑤ map
  一對一的對映的結合,key不能重複。
⑥ stack
  介面卡,必須結合其他的容器使用,stl中預設的內部容器是deque。先進後出,只有一個出口,不允許遍歷。
⑦ queue
  是受限制的deque,內部容器一般使用list較簡單。先進先出,不允許遍歷

2. vector、deque和list選擇準則

  vector、deque和list都是動態增長的,選擇標準主要是關注插入特性以及對元素的後續訪問要求。
  1) vector: 連續的記憶體區域,隨機訪問效率高,插入刪除效率低。Vector並不是隨每一個元素的插入而增長自己,而是當vector需要增長自身時,它實際分配的空間比當前所需的空間要多一些,也就是說,它分配了一些額外的記憶體容量,或者說他預留了這些儲存區(分配的額外容量的確切數目由具體實現定義)。實際上,對於小的物件,vector在實踐中比list效率更高。
  vector的動態自我增長越頻繁,元素插入的開銷就越大。兩種解決方案:
  a) 當vector開銷變大時,把vector轉換成list.
  b) 更常用的方案時,通過指標間接儲存複雜的類物件。首先,容量從1增加到256,重新分配的次數大大減少。其次,指向類物件的指標的拷貝和釋放不需要呼叫該類的拷貝建構函式和解構函式。
  2) list:

 非連續的記憶體區域,並通過一對指向首尾元素的指標雙向聯結起來,從而允許向前向後兩個方向進行遍歷。插入和刪除效率高,隨機訪問支援不好。
  3) deque: 也表示一段連續的記憶體區域,支援高效在首部插入和刪除元素,通過兩級資料結構來實現,一級表示實際的容器,第二級指向容器的首和尾。如果容器的主要行為是在前段插入元素,則deque比vector效率高。
  
 下面是選擇順序容器型別的一些準則
  1.如果我們需要隨機訪問一個容器則vector要比list好得多 。
  2.如果我們已知要儲存元素的個數則vector 又是一個比list好的選擇。
  3.如果我們需要的不只是在容器兩端插入和刪除元素則list顯然要比vector好 。
  4.除非我們需要在容器首部插入和刪除元素否則vector要比deque好。
  5.如果只在容易的首部和尾部插入資料元素,則選擇deque。
  6.如果只需要在讀取輸入時在容器的中間位置插入元素,然後需要隨機訪問元素,則可考慮輸入時將元素讀入到一個List容器,接著對此容器重新拍學,使其適合順序訪問,然後將排序後的list容器複製到一個vector容器中。

3. 連結串列與陣列區別

  連結串列和陣列一樣是一種資料結構,如何使用完全基於你的應用需求。
  連結串列和C++語言本身沒有任何聯絡。很多語言都可以實現連結串列資料結構。
  我講一下資料和連結串列的區別有可能幫助你對連結串列的使用有個感覺。
  陣列是將元素在記憶體中連續存放,由於每個元素佔用記憶體相同,所以你可以通過下標迅速訪問陣列中任何元素。但是如果你要在陣列中增加一個元素,你需要移動大量元素,在記憶體中空出一個元素的空間,然後將要增加的元素放在其中。同樣的道理,如果你想刪除一個元素,你同樣需要移動大量元素去填掉被移動的元素。
  連結串列恰好相反,連結串列中的元素在記憶體中不是順序儲存的,而是通過存在元素中的指標聯絡到一起。比如:上一個元素有個指標指到下一個元素,以此類推,直到最後一個元素。如果你要訪問連結串列中一個元素,你需要從第一個元素開始,一直找到你需要的元素位置。但是增加和刪除一個元素對於連結串列資料結構就非常簡單了, 只要修改元素中的指標就可以了。
  從上面的比較你可以看出,如果你的應用需要快速訪問資料,很少或不插入和刪除元素,你就應該用陣列;相反, 如果你的應用需要經常插入和刪除元素你就需要用連結串列資料結構了。然後你自己可以想一想什麼樣的應用用連結串列合適。