C 模板 實現 vector和list比較

時間 2023-03-22 10:30:09

1樓:匿名使用者

vector就是動態陣列。它也是在堆中分配內 存,元素連續存放,有保留記憶體,如果減少大小後記憶體也不會釋放。如果新值》當前大小時才會再分配記憶體。

對最後元素操作最快(在後面新增刪除 最快 ),此時一般不需要移動記憶體,只有保留記憶體不夠時才需要。對中間和開始處進行新增刪除元素操作需要移動記憶體,如果你的元素是結構或是類,那麼移動的同時還會進行構造和析構操作,所以效能不高(最好將結構或類的指標放入vector中,而不是結構或類本身,這樣可以避免移動時的構造與析構)。訪問方面,對任何元素的訪問都是o(1),也就是是常數的,所以vector常用來儲存需要經常進行隨機訪問的內容,並且不需要經常對中間元素進行新增刪除操作。

總之:需要經常隨機訪問請用vector

list就是連結串列,元素也是在堆中存放,每個元素都是放在一塊記憶體中。list沒有空間預留習慣,所以每分配一個元素都會從記憶體中分配,每刪除一個元素都 會釋放它佔用的記憶體,這與上面不同,可要看好了。

list在**新增刪除元素效能都很高,不需要移動記憶體,當然也不需要對每個元素都進行構 造與析構了,所以常用來做隨機操作容器。但是訪問list裡面的元素時就開始和最後訪問最快訪問其它元素都是o(n) ,所以如果需要經常隨機訪問的話,還是使用其它的好。

總之:經常新增刪除大物件的話,那麼請使用list

2樓:匿名使用者

編譯器推導不出來的原因是因為,vector與list的實際的實現的容器並不只有一個模組引數的,而是至少有兩個,只不過有預設值,你並時用的時候只提供一個而已。但在這種模板實現裡,預設引數是會被忽略的,所以你需要重新指定了。明白了吧?

同時,最好不要這樣使用stl容器,要寫插入方法,最好還是用iterator來做,提供一個帶begin的引數不是很好麼。參考 back_inserter 之類的模板。

c++ vector和list的區別

3樓:匿名使用者

主要區別:

1 是否支援隨機訪問:

vector支援下標直接訪問,理論上事件複雜度為o(1);list無法隨機訪問中間的元素,只能從兩頭開始遍歷,逐個獲取。

2 記憶體分佈:

vector可以看成是記憶體連續的,list的記憶體則由指標連線而成;vector每次擴大記憶體都會開闢額外的記憶體來「準備新元素插入」;list在兩端增刪元素的時間複雜度為o(1),vector為o(n)。從資料結構與演算法的角度更細緻的對比如下:

時間複雜度: vector list

查詢: o(1) o(n)

新增: o(n) o(1)

刪除: o(n) o(n)

空間複雜度:

連續記憶體分配與拷貝 不連續記憶體分配。

適用場景:對查詢要求高的場景 對順序沒有要求的序列。

資料不頻繁增刪 資料頻繁增刪。

4樓:匿名使用者

你好。vector和built-in陣列類似,它擁有一段連續的記憶體空間,並且起始地址不變,因此它能非常好的支援隨即存取,即操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝,另外,當該陣列後的記憶體空間不夠時,需要重新申請一塊足夠大的記憶體並進行記憶體的拷貝。這些都大大影響了vector的效率。

list就是資料結構中的雙向連結串列,因此它的記憶體空間可以是不連續的,通過指標來進行資料的訪問,這個特點使得它的隨即存取變的非常沒有效率,因此它沒有提供操作符的過載。但由於連結串列的特點,它可以以很好的效率支援任意地方的刪除和插入。

如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector;

如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list。

希望這樣解釋你可以較好理解。

c++ vector和list的區別

5樓:匿名使用者

資料結構。

vector和陣列類似,擁有一段連續的記憶體空間,並且起始地址不變。

因此能高效的進行隨機存取,時間複雜度為o(1);

但因為記憶體空間是連續的,所以在進行插入和刪除操作時,會造成記憶體塊的拷貝,時間複雜度為o(n)。

另外,當陣列中記憶體空間不夠時,會重新申請一塊記憶體空間並進行記憶體拷貝。

資料結構。list是由雙向連結串列實現的,因此記憶體空間是不連續的。

只能通過指標訪問資料,所以list的隨機存取非常沒有效率,時間複雜度為o(n);

但由於連結串列的特點,能高效地進行插入和刪除。

和list的區別。

我們看一個簡單的vector和list使用示例:

#include

#include

#include

using namespace std;

int main()

cout<<"v[2]="iterator itv=;

list::iterator itl=;

itv = itv+2;

//itl=itl+2; /編譯錯誤,list::iterator沒有過載+

itl++;list::iterator中過載了++,只能使用++進行迭代訪問。

itl++;

cout<<*itv<

vector擁有一段連續的記憶體空間,能很好的支援隨機存取,因此vector::iterator支援「+」等操作符。

list的記憶體空間可以是不連續,它不支援隨機訪問,因此list::iterator則不支援「+」等。

vector::iterator和list::iterator都過載了「++運算子。

總之,如果需要高效的隨機存取,而不在乎插入和刪除的效率,使用vector;

如果需要大量的插入和刪除,而不關心隨機存取,則應使用list。

c++ vector和list的區別

c實現伺服器和客戶端通訊問題,C 實現伺服器和客戶端通訊問題

正牌小卡 自動解壓不會。另外你向殼戶端傳的是大檔案的話,這就要考慮多執行緒技術了,用socket通訊來做,你先查查多執行緒socket通訊技術吧,還有訊息佇列 c socket網路程式設計,如何實現多客戶端和伺服器通訊 伺服器端 namespace socketserver 成功 serversoc...

C 中的介面和實現分別指的是什麼

一般地,我們稱c 類宣告中的 函式原型 為介面,它只是提供給了使用者如何使用的具體細節,而隱藏了具體的 類似地,我們稱類的成員函式的具體的 為實現。如下 class test void test test 這裡是實現,此處是test 函式具體的 使用者無需關心它是怎麼寫的。又如 test abc 此...

簡述c繼承和多型的含義及其實現方法

你猜我猜哇擦猜 一 封裝 封裝是實現物件導向程式設計的第一步,封裝就是將資料或函式等集合在一個個的單元中 我們稱之為類 被封裝的物件通常被稱為抽象資料型別。封裝的意義 封裝的意義在於保護或者防止 資料 被我們無意中破壞。在物件導向程式設計中資料被看作是一箇中心的元素並且和使用它的函式結合的很密切,從...