午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

MFC集合類簡介 - 含笑的日志 - 網(wǎng)易博客

 chensirDSP 2010-11-30

MFC集合類簡介

編程專欄 2010-08-22 00:34:37 閱讀24 評(píng)論0   字號(hào): 訂閱

數(shù)組,MFC數(shù)組類CArray
在頭文件Afxtempl.h中定義了CArray,它實(shí)際上是一個(gè)模板類,利用它
可以創(chuàng)建任何數(shù)據(jù)類型的類型安全數(shù)組.
非模板化數(shù)組類定義在Afxcoll.h中,有:CByteArray,CWordArray,CDwordArray...

相關(guān)函數(shù)
SetSize用來指定數(shù)組大小,重載“[]”運(yùn)算符調(diào)用數(shù)組的SetAt函數(shù)或GetAt函數(shù),
InsertAt用以插入元素或一個(gè)數(shù)組。
GetSize或GetUpperBound獲取數(shù)組元素個(gè)數(shù)。
刪除函數(shù):RemoveAt,RemoveAll,如果數(shù)組元素保存的是指向?qū)ο蟮闹羔槙r(shí),
要首先清除對(duì)象再刪除數(shù)組元素以防止內(nèi)存泄露:
delete arr[i];
arr.RemoveAt(i);

動(dòng)態(tài)調(diào)整數(shù)組大小
SetSize,SetAtGrow,Add

當(dāng)減小數(shù)組時(shí),SetSize并不會(huì)自動(dòng)縮小保存數(shù)組數(shù)據(jù)的緩沖區(qū),需要調(diào)用
FreeExtra,如:
array.SetSize(50);
array.SetSize(20);
array.FreeExtra();

同樣,對(duì)于RemoveAt和RemoveAll之后再調(diào)用FreeExtra可以縮小數(shù)組空間為剩下元素
需要的最新尺寸。

用CArray創(chuàng)建類型安全數(shù)組類
聲明一個(gè)CPoint對(duì)象的類型安全數(shù)組:
CArray<CPoint,CPoint&>array;
第一個(gè)參數(shù)指定了數(shù)組中的數(shù)據(jù)類型,第二個(gè)參數(shù)指定類型在參數(shù)列表中的表示方法。
另:非模板化數(shù)組類CUIntArray可以如下定義:
typedef CArray<UINT ,UINT> CUIntArray;

列表
可以將之前講述的數(shù)組看做是順序存儲(chǔ)的線性表,這里的列表視為鏈表,
這里的列表是雙向鏈表且不是循環(huán)的。

MFC列表類
非模板化列表類有:CObList(數(shù)據(jù)類型:CObject指針),
CPtrList(數(shù)據(jù)類型:void指針),CStringList(數(shù)據(jù)類型:Cstring)。
列表中的位置由抽象數(shù)值POSITION標(biāo)示,POSITION實(shí)際上是指向CNode數(shù)據(jù)結(jié)構(gòu)的指針。

用CList創(chuàng)建類型安全列表類
CList<CPoint,CPoint&>list;
如果在CList中使用了類而不是原始數(shù)據(jù)類型而且調(diào)用列表的Find函數(shù),則必須實(shí)現(xiàn)下列之一:
1.類重載==運(yùn)算符
2.覆蓋模板函數(shù)CompareElements。

否則程序不會(huì)得到編譯。

重載==運(yùn)算符:
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è)計(jì)映射表的主要目的就是給定一個(gè)關(guān)鍵字,可以很快地在表中找到對(duì)應(yīng)的項(xiàng)目,
通常只查找一次。
映射表生成后不久,會(huì)為一個(gè)列表分配內(nèi)存空間,該表實(shí)際上是一個(gè)指向CAssoc
結(jié)構(gòu)指針的數(shù)組,MFC使用CAssoc結(jié)構(gòu)來給映射表添加項(xiàng)目和關(guān)鍵字。
例如CMapStringToString定義CAssoc:
struct CAssoc
{
CAssoc*pNext;
UINT nHashKey;
CString key;
CString Value;
};

CAssoc結(jié)構(gòu)存放在散列表數(shù)組中,索引號(hào)為:i=nHashValue%nHashTableSize,
參見P254圖5-1,如果索引號(hào)相同,則會(huì)鏈成一個(gè)鏈表。

用CMap創(chuàng)建類型安全映射表
CMap<CString,CString&,CPoint,CPoint&>map;
如果使用自己的類調(diào)用CMap::Lookup則仍需重載==運(yùn)算符或覆蓋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)換了

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多