MFC模板CArray及其派生類
CArray及其派生類
1. 簡介:訪問方法及效率和普通的數組一樣,比普通數組強大的功能是可以改變數組的大小。Array采用隊列方式存儲數據,因而其內部數據元素是以物理方式順序排列的,所以檢索、順序執行GetAt()等函數的速度是相當快的。但是由于每次隊列長度變化后,數據都要重新申請內存、拷貝內存、釋放內存,Insert/Add/RemoveAt()的速度都很慢。
特點:通過索引(數組下標)訪問的速度很快,但是插入刪除操作很慢,因為插入刪除操作時,是需要移動元素的。
訪問方法:通過索引訪問,普通的數組怎么用,它就可以怎么用。
2. MFC數組類CArray的使用的操作詳解
MFC的數組類支持的數組類似于常規數組,可以存放任何數據類型。常規數組在使用前必須將其定義成能夠容納所有可能需要的元素,即先確定大小,而MFC數組類創建的對象可以根據需要動態地增大或減小,數組的起始下標是0,而上限可以是固定的,也可以隨著元素的增加而增加,數組在內存中的地址仍然是連續分配的。
MFC定義了數組模板類CArray,并針對各種常用變量類型定義了CByteArray,CArray,CUIntArray,CDArray,CStringArray,CObArray,CPtrArray。
CArray 通過模板類的參數類型設定各種類型
CByteArray 8位無符號整數 BYTE類型
CArray 16位無符號整數 WORD類型
CDArray 32位無符號整數 DWORD類型
CUIntArray 32位無符號整數 UINT類型
CStringArray CString字符串 string字符串
CObArray CObject類及其派生類
CPtrArray void* 類型指針
CObject
└CArray
template <class TYPE, class ARG_TYPE> class CArray : public CObject
參數:
TYPE 模板參數指定存儲在數組中的對象的類型。TYPE是一個由CArray返回的參數。
ARG_TYPE 模板參數指定用于訪問存儲在數組中對象的參數類型。通常是一個對TYPE的參考。ARG_TYPE是一個傳遞給CArray的參數。
如1:CArray <CPoint,CPoint&> m_Array;
如2:CArray<int, int> myArray; //對于基本類型如int,char和float一般要用參數傳遞
說明:
CArray類支持與CArray相似的數組,但是必要時可以動態壓縮并擴展。數組索引從0開始。可以決定是固定數組上界還是允許當添加元素時擴展當前的邊界。內存對上界是連續地分配空間,甚至一些元素可為空。和CArray一樣,CArray索引元素的訪問時間是不變的,與數組大小無關。
提示:
在使用一個數組之前,使用SetSize建立它的大小和為它分配內存。如果不使用
SetSize,則為數組添加元素就會引起頻繁地重新分配和拷貝。頻繁地重新分配和拷
貝不但沒有效率,而且導致內存碎片。
中的“收集”。
CArray類的成員
構造函數
CArray
構造一個空數組屬性
GetSize
獲得此數組中的元素數
返回最大的有效索引值
SetSize
設置包含在此數組中的元素數
操作
FreeExtra
釋放大于當前上界的未使用的內存
RemoveAll
從此數組移去所有元素元素訪問
GetAt
返回在給定索引上的值
SetAt
設定一個給定索引的值;數組不允許擴展
ElementAt
返回一個對數組中元素指針的臨時參考
GetData
允許對數組中的元素訪問。可以為NULL擴展數組
為一個給定索引設置值;如果必要,擴展數組
Add
在數組的末尾添加元素;如果必要,擴展數組
Append
在數組上附加另一個數組;如果必要,擴展數組
Copy
把另一個數組拷貝到數組上;如果必要,擴展數組
插入/移去
InsertAt
在指定的索引上插入一個元素(或另一個數組中的所有元素)
RemoveAt
在指定的索引上移去一個元素
運算符
operator []
在特定索引上設置或獲取元素
CArray應用舉例:源代碼:http://download.csdn.net/detail/nuptboyzhb/4211672
1. 新鍵一個基于對話框的應用程序,命名為CArrayTest,在 CarrayTestDlg.h文件在添加CArray的頭文件#include <afxtempl.h>
2. 為對話框新增一個成員變量:
CArray<CPoint,CPoint&>m_PoinyArray;//保存CPoint類型的數組
3. 在對話框的OnInitDialog()函數中初始化數組的大小和數組中的值
int m_point_num=200;
m_PoinyArray.SetSize(m_point_num);
for(int i=0;i<m_point_num;i++)
{
CPoint tempPT;
tempPT.x=i;
tempPT.y=i*10;
m_PoinyArray.SetAt(i,tempPT);
}
//即,點的橫坐標和索引值相同,點的縱坐標是索引值的10背;
4. 為對話框添加如下控件(詳見源代碼)
4.1 為編輯框關聯一個整型的變量index
4.2 分別編寫10個按鈕的消息響應函數
4.2.1獲取
4.2.2 刪除
4.2.3 插入
4.2.4 設定
4.2.5 SetAtGrow
4.2.6 GetSize
4.2.7 GetUpperBound
4.2.8 Add
4.2.9 輸出全部的點
4.2.10刪除全部的點
以上按鈕,基本涵蓋了CArray類的大部分成員函數;
CArray的串行化
CArray不需要串行化,直接調用父類的Serialize函數即可;如:
void CGraduationDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
m_ObArray.Serialize(ar);
}
else
{
// TODO: add loading code here
m_ObArray.Serialize(ar);
}
}
注意:CArray的成員類型,如果不是常見的可串行化的類型,則必須各自實現自己的串行化!
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成