CArray,CMap,CList 速度比較

2021-06-26 18:30:53 字數 3940 閱讀 7292

出處:

1. 陣列

--carray

訪問方法及效率和普通的陣列一樣,比普通陣列強大的功能是可以改變陣列的大小。

array採用佇列方式儲存資料,因而其內部資料元素是以物理方式順序排列的, 所以檢索、順序執行getat()等函式的速度是相當快的。但是由於每次佇列長度變化後,資料都要重新申請記憶體、拷貝記憶體、釋放記憶體,因而 insert/add/removeat()的速度都很慢。如果你使用的資料元素尺寸相當大,而且陣列的操作相當複雜,頻繁使用insertat /setat/removeat等,應該考慮使用clist來代替。但是如果考慮array中儲存指標而不是資料本身,效率也可以接受。

特點:通過索引

(陣列下標

)訪問的速度很快

,但是插入刪除操作很慢,因為插入刪除操作時,是需要移動元素的。

訪問方法:通過索引訪問,普通的陣列怎麼用,它就可以怎麼用。

mfc的陣列類支援的陣列類似於常規陣列,可以存放任何資料型別。常規陣列在使用前必須將其定義成能夠容納所有可能需要的元素,即先確定大小,而

mfc陣列類建立的物件可以根據需要動態地增大或減小,陣列的起始下標是

0,而上限可以是固定的,也可以隨著元素的增加而增加,陣列在記憶體中的位址仍然是連續分配的。

mfc定義了陣列模板類

carray

,並針對各種常用變數型別定義了

cbytearray

,carray

,cuintarray

,cdarray

,cstringarray

,cobarray

,cptrarray。

陣列類

變數型別

變數數值範圍

標頭檔案carray

通過模板類的引數型別設定各種型別

afxtempl.h

cbytearray 8

位無符號整數

byte型別

0—255

afxcoll.h

carray 16

位無符號整數

word型別

0—65535

afxcoll.h

cdarray 32

位無符號整數

dword型別

0—4294967295

afxcoll.h

cuintarray 32

位無符號整數

uint型別

0—4294967295

afxcoll.h

cstringarray

cstring

字串string

字串

afxcoll.h

cobarray

cobject

類及其派生類

afxcoll.h

cptrarray

void* 

型別指標

afxcoll.h

應用例子1:

carray m_array;

該語句定義乙個

carray

陣列物件,模板類

carray

有兩個引數,第乙個引數為陣列元素的型別,該例中是

cpoint

,即m_array

是cpoint

陣列;第二個引數為引用型別,一般有兩種選擇,一種選擇與第乙個引數型別相同,它意味著陣列物件作為引數傳遞時,傳遞的是陣列物件。第二種選擇是第乙個引數型別的引用,它意味著陣列物件作為引數傳遞時,傳遞的是陣列物件的指標。因此,尤其對於較複雜的陣列結構型別,推薦使用引用傳遞,節約記憶體同時加快程式執行速度,正如本例使用的是

cpoint&。、

注:carraymyarray;   //對於基本型別如int,char和float一般要用引數傳遞

m_array.setsize(10,10);

setsize

函式設定陣列的大小,該函式有兩個引數,第乙個引數設定陣列的大小;第二個引數設定陣列增長時記憶體分配的大小,預設值是-

1,使用預設值可以保證記憶體分配得更加合理。本例中第二個引數是

10,意即增加乙個陣列元素會分配

10個元素大小的記憶體供陣列使用。

您可以隨時使用

setsize

函式設定陣列的大小,如果第乙個引數值小於陣列已有成員數量,多於第乙個引數值的成員將被截去並釋放相應記憶體。

在使用carray

陣列前,最好先使用

setsize

確定其大小並申請儲存空間。如果不這樣做,向陣列中增加元素時,需要不斷地移動和拷貝元素造成執行的低效率和記憶體碎塊。

應用例子2:

void carraydlg::onarraycstring()

**簡要說明:

m_string.setatgrow(2,szdog); edu-cn.com

setatgrow有兩個引數,第乙個引數決定陣列元素的序號值,第二個引數是元素的值。該函式根據序號值設定相應陣列元素的值,功能與setat相近,不同之處是使用該函式設定元素值時,如果序號值大於陣列的上界,陣列會自動增長。

編譯執行程式,細心的讀者您可能會看到,第一行字元是「tiger」,第二行字元是「bear」,這是我們預料之中的,但第三行是空串,第四行是「dog」。空串是怎樣造成的呢?細分析下面三行**就可以知道:

m_string.setatgrow(0,sztiger);m_string.setatgrow(2,szdog);m_string.insertat(1,szbear);

第一行設定元素0為「tiger」,這是沒有疑義的。

第二行設定元素2為「dog」,但是在設定元素2的同時自動將元素1填充為空串。

第三行插入「bear」為元素1,同時原來的元素1和元素2後移為元素2和元素3。

怎麼樣,這回明白了吧。

m_string.insertat(1,szbear);

insertat函式在指定序號處插入相應元素,該函式在執行過程中,插入點後面的元素會自動後移。dc.textout(10,displaypos,m_string[x]);其中,m_string[x]是陣列類對操作符的過載,陣列類carray允許使用操作符,類似於的常規陣列。m_string[x]也可以用m_string.getat(x)替代。

m_string.removeat(2); 

removeat只有乙個引數,即元素序號值。該函式根據元素序號值刪除相應元素值,後面的元素會自動前移。

最後再說明一點:removeat,insertat函式操作時會使得陣列元素移位,執行時間大於setat,removeall,add函式。 2.

雙鏈表--clist

特點:插入刪除很快。但是通過索引訪問很慢,因為通過索引訪問的時候,實際上是煉表頭開始計算個數的。所以在遍歷鍊錶的時候不要這樣寫:

for(int i=0; i

訪問方法:通過

position

變數訪問,它實際上就是雙鏈表節點的指標。我覺得這種訪問方法比加個什麼

iterator

要好,因為很多時候我們都是在對鍊錶進行插入刪除操作,這個時候乙個

iterator

的功能有限。

3. 雜湊

(hash)

表--cmap

特點:通過雜湊演算法將

key計算乙個索引值

,基本上就是乙個空間換時間的應用。對於重複的

key,它和大多數的

hash

表結構一樣,採用了乙個鍊錶。所以,如果

key重複比較多的話,他的查詢還是很慢的。

訪問方法:也是用

position

變數。不過需要注意的是,通過

cmap

提供的遍歷函式得到的元素的順序恰好和新增的順序相反。

4. 二叉樹

--無對應類

特點:乙個排序二叉樹的查詢就是乙個天生的二分法。所以,如果向二叉樹中新增元素時需要進行比較的話,最好直接建立成二叉排序樹,這樣查詢起來很快。例如,

cmap

在key

重複時就可以用二叉樹代替鍊錶。

閒的沒事比速度

1,陣列插入 int num new int 1000000 datetime dt1 datetime.now for int i 0 i 1000000 i datetime dt2 datetime.now console.writeline 一百萬條資料插入所需時間 陣列 2,arrayli...

MyISAM查詢速度為什麼比InnoDB快

innodb mylsam兩者引擎所用的索引的資料結構都是b 樹,不過區別在於 mylsam中的b 樹的資料結構儲存的內容是實際資料的位址值,它的索引和實際資料是分開的,只不過使用索引指向實際資料,這種索引的模式被成為非聚集索引。innodb中b 樹的資料結構儲存的都是實際的資料,這種索引稱為聚集索...

關於資料庫讀取速度與檔案IO讀取速度的比較分析

最近看到了這個很有意思的問題,以前也沒有思考過。如果有人問,到底是在 中跟 io檔案交換速度快,還是跟資料庫交換速度快呢?這個問題還是比較複雜的,資料庫的儲存資料方式要比單純的檔案儲存複雜很多。其實,如果我們熟悉資料庫的結構,那麼很容易解決這個問題。簡單的來講,乙個執行的資料庫例項是由兩部分組成的,...