開始用過CArray這個非常好用的類(如何使用看這篇文章MFC數組類CArray的使用的操作詳解 )。後來又發現CList這個類與它有些相似,於是Google了一下。在這裡匯總一些比較好理解的說法去熟悉他們。以便在以後的編程中應用自如:
Title
Array採用隊列方式儲存資料,因而其內部資料元素是以物理方式順序排列的,所以檢索、順序執行GetAt()等函數的速度是相當快的。但是由於每次隊列長度變化後,資料都要重新申請記憶體、拷貝記憶體、釋放記憶體,因而Insert/Add/RemoveAt()的速度都很慢。如果你使用的資料元素尺寸相當大,而且數組的操作相當複雜,頻繁使用InsertAt/SetAt/RemoveAt等,應該考慮使用CList來代替。但是如果考慮Array中儲存指標而不是資料本身,效率也可以接受。
List採用鏈表方式儲存資料,因而當鏈表資料有所變動時,只做了一下指向變動,所以即使資料元素非常多單個資料元素也很大,執行Insert/Add/Remove的速度都很快,但是因為沒有統一的Index,因而如果要找到某個元素只有遍曆整個鏈表。整體上說,List的使用比較繁瑣,特別為小尺寸資料設計List更是得不償失的,這也是為什麼有CWordArray而沒有CWordList的原因,因而在大多數情況下應該有限考慮是否可以使用Array來儲存資料。
使用什麼主要看你的使用要求了
Title
CArray CArray 提供了規則數組不具備的靈活性,但是程式可能不需要它。如果知道數組的特定限制,反而可以使用全域固定數組。如果使用 CArray,當需要重新分配時,使用 CArray::SetSize 建立它的大小並指定增長的元素數。否則,添加元素可能導致數組經常重新分配和複製,這樣做效率很低而且可能產生記憶體片段。還需注意的是,如果將一項插入數組中,則 CArray 移動記憶體中後面的項並且可能需要增長數組。這些操作可能導致緩衝未命中和頁錯誤。如果瀏覽 MFC 使用的代碼,可能會明白可編寫一些更特定於方案的東西以提高效能。例如,由於 CArray 是一個模板,可以提供特定類型的 CArray 專用化。
CList CList 是雙向連結資料表,因此頭、尾和表中已知位置 (POSITION) 的元素插入速度很快。按值或者索引尋找需要順序搜尋,然而如果表很長則速度可能慢。如果代碼不要求雙向連結資料表,可能需要重新考慮使用 CList。使用單向連結資料表可省去更新所有操作的附加指標以及該指標的記憶體的系統開銷。這種附加記憶體不太好,但卻是解決緩衝未命中或頁錯誤的另一種可能的方法。
Title
簡單數組和列表的用法
簡單的數組類 CArray 和列表類 CList 採用兩個參數:TYPE 和 ARG_TYPE。這些類可以儲存任何在 TYPE 參數中指定的資料類型:
基本 C++ 資料類型,如 int、char 和 float
C++ 結構和類
定義的其他類型
考慮到方便性和效率,可以使用 ARG_TYPE 參數來指定函數參數的類型。通常情況下,將 ARG_TYPE 指定為對 TYPE 參數中命名類型的引用。例如:
CArray<int, int> myArray;
CList<CPerson, CPerson&> myList;
第一個樣本聲明了一個包含多個 int 的數組集合 myArray。第二個樣本聲明了一個儲存 CPerson 對象的列表集合 myList。集合類的某些成員函數採用其類型由 ARG_TYPE 模板參數指定的參數。例如,CArray 類的 Add 成員函數採用 ARG_TYPE 參數:
CArray<CPerson, CPerson&> myArray;
CPerson person;
myArray->Add( person );