友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第72章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




    于集合类的更为系统的讲解请参阅其它有关章节。  



MFC中的集合类分为三种:数组             (array)、列表     (list)   和映射 

(map)。  



数组和通常在C或C++中使用的数组一样,是一个有序的元素序列,其 

中的每一个元素在连续的整数进行索引,不同的是MFC中的数组类可 


…………………………………………………………Page 444……………………………………………………………

以自动的增长以使它可以容纳新添加的元素。如果不需要添加新的元 

素,那么访问数组中的元素和使用标准的C/C++数组一样的快。  



列表也是一个有序的元素序列,但其中的元素并不以一个整数作为其 

索引,取代的方法是每一个元素         (如果它不是列表的开头和结尾的 

话)  都保存了指向前一个元素和后一个元素的指针。列表本身的有序 

的,但列表中的元素自身的存储则不一定是有序的,从元素中间插入 

一个元素事实上只需修改前一个元素的指向后一个元素的指针和后一 

个元素的指向前一个元素的指针,删除一个元素的过程也是类似的, 

这和数组是不同的,在数组中,要添加或删除元素必须移动数组中位 

于指定元素之后的所有元素。因此,在需要大量的进行元素的插入或 

删除时,使用列表要比使用数组快很多。  



映射也被称作字典      (dictionary)。映射的最大的特点的它将其中的 

元素和一个唯一的键值相关联。键和数组中的整数索引相类似,可以 

使用键来检索映射中的元素,这弥补了列表中的元素不能进行索引的 

缺点。  



表8。2总结了三种集合类的特点。  



                表8。2 不同集合类的特点  



    集合类  是否有  是否有索引   效率         是否允许重复 

     型   序                       元素  



                      插入元 查找指定的 

                      素   元素  

     数组  是    使用整数作为  慢   慢      是  

              索引  

     列表  是    否       快   慢      是  

     映射  否    使用键作为索  快   快      允许重复的 

              引                  值,但不允许 

                                 重复的键  



由MFC提供的集合类分为两种类型:即基于C++模板的集合类和不基于 

C++模板的集合类。不基于模板的集合类从MFC  1。0开始提供,现在还 

保留它们的主要原因是为了向后兼容,便于过去编写的程序进行移 

值。如果您是从头开始使用集合类的话,则应该从新提供的基于模板 

的集合类中生成类型安全的集合类。  



MFC提供的新的基于模板的集合类对于数组、列表和映射的实现如表 

8。3所示。  


…………………………………………………………Page 445……………………………………………………………

                     表8。3 基于模板的MFC集合类  



           集合内   数组           列表          映射  

           容  



           任意类   CArray       Clist      CMap  

           型的对 

           象  



           指向任   CTypedPtrArray  CTypedPtrList  CTypedPtrMap  

           意对象 

           的指针  



表8。4所示的不基于模板的MFC集合类仍可以使用。  



您可以根据上面所给的特点来为您的应用程序选定的合适的集合类。 

下面我们将举例来说明各个集合类的基本使用方法。  



                        表8。 4 非模板集合类  



              数组        列表         映射  



             CObArray   CObList   CMapPtrToWord  



             CByteArray  CPtrList  CMapPtrToPtr  



             CDWordArray  CStringList  CMapStringToOb  



             CPtrArray            CMapStringToPtr  



             CStringArray         CMapStringToString  



             CWordArray           CMapWordToOb  



             CUIntArray           CMapWordToPtr  



    (1) 使用CArray模板创建数组集合  



正如同前面所说,很多时候我们使用集合类来保存文档中的数据。在 

下面的例子中,我们在文档中使用集合类来创建一个功能非常简单的 

文本文件查看程序。这个实用程序的功能还很单一,这里我们仅是用 

它来作为说明集合类的使用的示例。  



首先我们需要为这个示例创建一个MDI工程,可以使用AppWizard来完 

成很多模式化的东西,这里我们假定读者已经对如何使用AppWizard 

创建起始工程非常地熟悉,所以不再重复的讲述这个过程。如果您需 


…………………………………………………………Page 446……………………………………………………………

要帮助的话,可以看一看          “8。2使用AppWizard创建框架应用程序” 

和   “8。3生成文档”  中的示例。在下面的讲述中,我们假定您所创 

建的工程名为TextViewer,相应的文档类和视类为CTextDoc和 

CTextView。  



刚开始的时候我们考虑使用CArray模板来创建该应用程序,这也是最 

直观的想法。  



要在程序中使用MFC模板类,需要添加头文件afxtempl。h,由于在整 

个过程中我们都  没有必要去修改这个头文件 (并且,我们也不建议您 

去修改这个头文件),所以我们可以把它添加工程TextViewer的预编 

译头文件StdAfx。h中。这样做还可以获得额外的好处,就是没有必要 

对每一个包含了StdAfx。h头文件的源文件都添加  



#include   



一行。由于由AppWizard和ClassWizard生成的文件大多添加了下面的 

代码:  



#include   



因此,我们就可以避免为每一个需要使用模板的源文件都手动的添加 

对afxtempl。h的包含。  



完成这一步之后,在CTextDoc的定义中添加下面的代码:  



public:  



CArray  m_text;  



从CArray模板生成指定类型的元素的数组的语法为  



CArray  myArray;  



其中使用到了两个参数,第一个参数TYPE为数组类所存储的元素类 

型,可以指定的元素类型包括:基本C++数据类型、C++结构和类以及 

其它的用户自定义类型。第二个参数指定在函数参数传递中的使用的 

数据类型,对于结构和类类型的元素,我们一般都将ARG_TYPE参数设 

置为对TYPE参数指定的数据的引用,如上面的例子。把函数参数指定 

为对数据的引用可以生成更有效的代码,这对于在集合类中使用大的 

类对象非常有意义。  



在本示例中使用向集合类中添加元素是在文档的串行化时进行的。按 

下面的代码重载类CTextDoc的Serialize成员函数:  


…………………………………………………………Page 447……………………………………………………………

/////////////////////////////////////////////////////////////  



// CTextDoc 串行化  



void CTextDoc::Serialize(CArchive& ar)  



 {  



CString str;  



if (ar。IsStoring())  



 {  



for (int i=0; i” 

运算符将得不到正确的结果;出于同样的原因,如果是使用           
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!