數(shù)組,,MFC數(shù)組類CArray
在頭文件Afxtempl.h中定義了CArray,它實際上是一個模板類,利用它
可以創(chuàng)建任何數(shù)據(jù)類型的類型安全數(shù)組.
非模板化數(shù)組類定義在Afxcoll.h中,有:CByteArray,CWordArray,CDwordArray...
相關(guān)函數(shù)
SetSize用來指定數(shù)組大小,,重載“[]”運算符調(diào)用數(shù)組的SetAt函數(shù)或GetAt函數(shù),,
InsertAt用以插入元素或一個數(shù)組,。
GetSize或GetUpperBound獲取數(shù)組元素個數(shù),。
刪除函數(shù):RemoveAt,,RemoveAll,,如果數(shù)組元素保存的是指向?qū)ο蟮闹羔槙r,
要首先清除對象再刪除數(shù)組元素以防止內(nèi)存泄露:
delete arr[i];
arr.RemoveAt(i);
動態(tài)調(diào)整數(shù)組大小:
SetSize,,SetAtGrow,,Add
當(dāng)減小數(shù)組時,SetSize并不會自動縮小保存數(shù)組數(shù)據(jù)的緩沖區(qū),,需要調(diào)用
FreeExtra,,如:
array.SetSize(50);
array.SetSize(20);
array.FreeExtra();
同樣,對于RemoveAt和RemoveAll之后再調(diào)用FreeExtra可以縮小數(shù)組空間為剩下元素
需要的最新尺寸,。
用CArray創(chuàng)建類型安全數(shù)組類
聲明一個CPoint對象的類型安全數(shù)組:
CArray<CPoint,CPoint&>array;
第一個參數(shù)指定了數(shù)組中的數(shù)據(jù)類型,,第二個參數(shù)指定類型在參數(shù)列表中的表示方法。
另:非模板化數(shù)組類CUIntArray可以如下定義:
typedef CArray<UINT ,UINT> CUIntArray;
列表
可以將之前講述的數(shù)組看做是順序存儲的線性表,,這里的列表視為鏈表,,
這里的列表是雙向鏈表且不是循環(huán)的。
MFC列表類
非模板化列表類有:CObList(數(shù)據(jù)類型:CObject指針),,
CPtrList(數(shù)據(jù)類型:void指針),,CStringList(數(shù)據(jù)類型:Cstring)。
列表中的位置由抽象數(shù)值POSITION標(biāo)示,,POSITION實際上是指向CNode數(shù)據(jù)結(jié)構(gòu)的指針,。
用CList創(chuàng)建類型安全列表類
CList<CPoint,CPoint&>list;
如果在CList中使用了類而不是原始數(shù)據(jù)類型而且調(diào)用列表的Find函數(shù),則必須實現(xiàn)下列之一:
1.類重載==運算符
2.覆蓋模板函數(shù)CompareElements,。
否則程序不會得到編譯,。
重載==運算符:
class CPoint3D
{
public:
CPoint3D(){x=y=z=0}
CPoint3D(int xPos,int yPos,int zPos)
{
x=xPos;
y=yPos;
z=zPos;
}
operator==(CPoint3D point)const
{
return (x==point.x&&y==point.y&&z==point.z);
}
public:
int x,y,z;
};
覆蓋模板函數(shù)CompareElements:
class CPoint3D
{
public:
CPoint3D(){x=y=z=0}
CPoint3D(int xPos,int yPos,int zPos)
{
x=xPos;
y=yPos;
z=zPos;
}
public:
int x,y,z;
};
BOOL AFXAPI CompareElements(const CPoint3D*P1,const CPoint3D*P2)
{
return(P1->x==P2->x&&P1->y==P2->y&&P1->z&&P2->z);
}
映射表
設(shè)計映射表的主要目的就是給定一個關(guān)鍵字,可以很快地在表中找到對應(yīng)的項目,,
通常只查找一次,。
映射表生成后不久,會為一個列表分配內(nèi)存空間,,該表實際上是一個指向CAssoc
結(jié)構(gòu)指針的數(shù)組,,MFC使用CAssoc結(jié)構(gòu)來給映射表添加項目和關(guān)鍵字,。
例如CMapStringToString定義CAssoc:
struct CAssoc
{
CAssoc*pNext;
UINT nHashKey;
CString key;
CString Value;
};
CAssoc結(jié)構(gòu)存放在散列表數(shù)組中,,索引號為:i=nHashValue%nHashTableSize,
參見P254圖5-1,如果索引號相同,,則會鏈成一個鏈表,。
用CMap創(chuàng)建類型安全映射表
CMap<CString,CString&,CPoint,CPoint&>map;
如果使用自己的類調(diào)用CMap::Lookup則仍需重載==運算符或覆蓋CompareElements函數(shù)。
類型指針類
CTypedPtrList<CObList,CLine*>list;
...
CLine*pLine=new CLine(x,0,x,100);
list.AddTail(pLine); //CLine*--》CObject*
...
CLine*pLine=list.GetNext(pos); //無需強(qiáng)制轉(zhuǎn)換了