1、MFC程序设计程序设计集合类作作 者:李者:李 季季主要内容主要内容l数组l列表l映射l类型指针类l基于模板的集合类数组数组lC和C+的数组缺陷无边界检查lInt array10;for(int i=0;i=0&nIndex=0&nIndex m_nSize);m_pDatanIndex=nVal;数组数组lCArray array(10);for(int I=0;I=10;i+)array.Set(i,i+1);MFC数组类数组类特定类型特定类型类 名数据类型CByteArray8位字节(BYTE)CWordArray16位字节(WORD)CDWordArray32位双字节(DWORD)CU
2、IntArray无符号整型(UINT)CStringArrayCStringCPtrArrayvoid指针CObArrayCObject指针MFC数组类函数数组类函数声明、初始化声明、初始化lCUIntArray array;array.SetSize(10);for(int I=0;i10;i+)arrayi=i+1;lCSrtingArray array;array.SetSize(10);for(int I=0;I 10;i+)CString string;string.Format(_T(“%d”),i);array=srting;MFC数组类函数数组类函数添加添加lCUIntArra
3、y array;array.SetSize(9);for(int I=0;I 4;i+)arrayi=I+1;for(I=4;I 9;i+)arrayi=I+2;array.InsertAt(4,5);MFC数组类函数数组类函数删除删除lCUIntArray array;array.SetSize(10);for(int i=0;i 10;i+)arrayi=i+1;array.RemoveAt(0);TRACE(_T(“Count=%dn”),array.GetSize();array.RemoveAt(0,3);TRACE(_T(“Count=%dn”),array.GetSize();a
4、rray.RemoveAll();TRACE(_T(“Count=%dn”),array.GetSize();MFC数组类函数数组类函数删除删除l如果数组元素是CPtrArray或CObArray类型,要先删除被删除指针所指对象然后清空数组。l错误的写法array.RemoveAll();l正确的写法int nSize=array.GetSize();for(int i=0;i nSize;i+)delete arrayi;array.RemoveAll();MFC数组类数组类动态调整数组大小动态调整数组大小lCUIntArray array;array.SetSize(10);for(int
5、 i=0;i 10;i+)arrayi=i+1;array.SetSize(20);for(i=10;i 20;i+)arrayi=i +1;注:原来的项仍保持原值。MFC数组类数组类动态调整数组大小动态调整数组大小lCUIntArray array;for(int i=0;i10;i+)array.SetAt(I,i+1);lCUIntArray array;for(int i=0;i10;i+)array.SetAtGrow(I,i+1);tlCUIntArray array;for(int i=0;i10;i+)array.Add(i+1);l自他可以自动增大数组的函数有:InsertA
6、t、Append、CopyMFC数组类数组类CArray类类l模板类,可为任意数据类型创建类型安全数组类。lCArray array;for(int i=0;i10;i+)array.SetAtGrow(i,CPoint(i*10,0);int nCount=array.GetSize();for(i=0;inCount;i+)CPoint point=arrayi;TRACE(_T(“x=%d,y=%dn”),point.x,point.y);MFC数组类数组类基于模板基于模板lCArraylTYPE用来指定元素的数据类型,可以是C+基础类型(如int、char、long、float等)、结
7、构或类lARG_TYPE用来指定成员函数的参数类型ltypedef CArray CUIntArray;l与CUIntArray等价列表列表l包含指向其他列表项指针的列表项集合。l列表分类单链表双向链表循环链表MFC列表类列表类特定类型特定类型类 名数据类型CObListCObject指针CPtrListvoid指针CStringListCStringMFC列表类列表类lMFC列表是双向链表。lPOSITION标识列表中的位置,实际上是指向CNode数据结构的指针。lCNode包含三个字段:指向下一个CNode结构的指针、一个指向上一个CNode结构的指针、一个指向列表项数据的指针,MFC列表
8、类函数列表类函数声明、添加声明、添加lCStringList list;for(int i=0;i=0;i-)list.AddHead(szScorei);MFC列表类函数列表类函数遍历遍历lPOSITION pos=list.GetHeadPosition();while(pos!=NULL)CString string=list.GetNest(pos);TRACE(_T(“%sn”),string);lPOSITION pos=list.GetPrev(pos);while(pos!=NULL)CString string=list.GetPrev(pos);TRACE(_T(“%sn”
9、),string);MFC列表类列表类CList类类l模板类,可为任意数据类型创建类型安全列表类。lCList list;for(int i=0;i10;i+)list.AddTail(CPoint(i*10,0);POSITION pos=list.GetHeadPosition();while(pos!=NULL)CPoint point=list.GetNext(pos);TRACE(_T(“x=%d,y=%dn”),point.x,point.y);MFC列表类列表类CList类类l如果在CList中使用了类并且调用Find函数,应满足下列条件之一:类具有重载了的=运算符,执行与相似对
10、象的比较。用特殊类型的版本覆盖了模板函数CompareElements,执行对两个类实例的比较。映射映射l又称词典,一种表格,其中一种项目是另一种项目的关键字。l元素承对存在,一为键值对象(key object),一为实值对象(value object)。MFC映射类映射类特定类型特定类型类 名说 明CMapWordToPtr保存void指针,关键字为WORDCMapWordToOb保存CObject指针,关键字为WORDCMapPtrToWord保存WORD,关键字为void指针CMapPtrToPtr保存void指针,关键字为其他void指针CMapStringToOb保存CObject指
11、针,关键字为字符串CMapStringToPtr保存void指针,关键字为字符串CMapStringToString 保存字符串,关键字为其他字符串MFC映射类函数映射类函数lCMapStringToString map;map_T(“Sunday”)=_T(“Dimanche”);map_T(“Monday”)=_T(“Lundi”);map_T(“Tuesday”)=_T(“Mardi”);map_T(“Wednesday”)=_T(“Mercredi”);map_T(“Thursday”)=_T(“Jeudi”);map_T(“Friday”)=_T(“Vendredi”);map_T(
12、“Saturday”)=_T(“Samedi”);lCString string;if(map.Lookup(_T(“Thursday”),string)TRACE(_T(“Thursday in English=%s in Frenchn”),string);MFC映射类函数映射类函数lPOSITION pos=map.GetStartPosition();while(pos!=NULL)CString strKey;CString strItem;map.GetNextAssoc(pos,strKey,strItem);TRACE(_T(“Key=%s,Item=%sn”),strKey,
13、strItem);lFdsMFC映射类映射类CMap类类l模板类,可为任意数据类型创建类型安全映射类。lCMap map;map0=CPoint(0,0);map1=CPoint(100,0);map2=CPoint(100,100);map3=CPoint(0,100);CPoint point;if(map.Lookup(2,point)TRACE(_T(“2=(%d,%d)n”),point.x,point.y);类型指针类类型指针类类 名说 明CTypedPtrArray 管理指针数组CTypedPtrList管理指针链接列表CTypedPtrMap管理使用指针作为项目或关键字的映射类
14、型指针类类型指针类lCTypedPtrList list;fot(int i=0;i10;i+)int x=i*10;Cline*pLine=new Cline(x,0,x,100);list.AddTail(pLine);POSITION pos=list.GetHeadPosition();while(pos!=NULL)Cline*pLine=list.GetNext(pos);集合类集合类类型 有序索 引插入速度 查询速度 复制元素Array是是(整数索引值)慢慢可以List是否快慢可以Map否是(关键字)快快实值可以基于模板的集合类基于模板的集合类lCArray lCList lCMap lCTypedPtrArray lCTypedPtrList lCTypedPtrMap 基于模板的集合类基于模板的集合类l元素类型为自创类时,如调用查询函数,须重载=运算符或CompareElements函数。l元素类型为指针时,全部删除前须逐一删除被删除指针所指对象。