C 中陣列 鍊錶和vector等容器之間的區別

2021-07-23 15:16:37 字數 2769 閱讀 7649

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

② deque

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

③ list

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

④ set

內部元素唯一,用一棵平衡樹結構來儲存,因此遍歷的時候就排序了,查詢也比較快的哦。

⑤ map

一對一的對映的結合,key不能重複。

⑥ stack

介面卡,必須結合其他的容器使用,stl中預設的內部容器是deque。先進後出,只有乙個出口,不允許遍歷。

⑦ queue

是受限制的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容器中。

鍊錶和陣列一樣是一種資料結構,如何使用完全基於你的應用需求。

鍊錶和c++語言本身沒有任何聯絡。很多語言都可以實現鍊錶資料結構。

我講一下資料和鍊錶的區別有可能幫助你對鍊錶的使用有個感覺。

陣列是將元素在記憶體中連續存放,由於每個元素占用記憶體相同,所以你可以通過下標迅速訪問陣列中任何元素。但是如果你要在陣列中增加乙個元素,你需要移動大量元素,在記憶體中空出乙個元素的空間,然後將要增加的元素放在其中。同樣的道理,如果你想刪除乙個元素,你同樣需要移動大量元素去填掉被移動的元素。

鍊錶恰好相反,鍊錶中的元素在記憶體中不是順序儲存的,而是通過存在元素中的指標聯絡到一起。比如:上乙個元素有個指標指到下乙個元素,以此類推,直到最後乙個元素。如果你要訪問鍊錶中乙個元素,你需要從第乙個元素開始,一直找到你需要的元素位置。但是增加和刪除乙個元素對於鍊錶資料結構就非常簡單了, 只要修改元素中的指標就可以了。

從上面的比較你可以看出,如果你的應用需要快速訪問資料,很少或不插入和刪除元素,你就應該用陣列;相反, 如果你的應用需要經常插入和刪除元素你就需要用鍊錶資料結構了。然後你自己可以想一想什麼樣的應用用鍊錶合適。

參考文獻:

c 中的array陣列和vector陣列

我覺得實驗一下會記得比較牢,話不多直接上 下面是array陣列,感覺用的不多。cpp 風格陣列 array include include include using namespace std intmain for int i 0 i myint.size i size 獲取長度,vector也...

倒置陣列和鍊錶 C

演算法很簡單,兩個變數,左邊的一直加,右邊的一直減,兩者相同後停止掃瞄.1.cpp created on 2015 11 11 author sunyuan reserve array includeusing namespace std void reverve int,int void outp...

C 模板實現Vector和雙向鍊錶

define crt secure no warnings 1 include include using namespace std template class vector vector size t n,const t data vector const vector v pdata new...