`
wgq837051
  • 浏览: 85978 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MFC集合类

阅读更多

MFC中的集合类
  实际上集合类就是数据结构中的顺序存储结构和链表存储结构。它的优点就是建立这样的存储结构简单,并且把相关的操作集中成函数,方便用户的调用。比如顺序存储用到数组,如果要在数组中的固定位置添加一项,普通的方法就是要用一个for循环,有点烦琐。而在集合类中只要用一个add函数 就完成了,相对简单一点。
  数据结构是软件设计中的一个重要组成部分。因此我们有必要搞清楚集合类的相关问题。
  1。种类型
  集合类中有3种大的类型:
  (1) Array:数组,可以动态的改变大小,有索引值和最大下标等。
  (2) List:双向链表,无索引,链表有头尾,插入元素要比数组快。
  (3) Map:是一种映射,俗名“字典”,是一种关联式数组。(在此不做讨论)
  2.各自特点:
  类型  是否有序    插入元素速度     搜索元素速度           索引
  Array   有          慢                  慢                 有
  List    有          快                  慢                 无
  3.MFC中的集合类
      类             是否使用模板    是否支持串行化      是否支持倾印
  CArray              是                  是                  是
  CTypedPtrArray      是                  可能                是
  CByteArray          否                  是                  是
  CDWordArray         否                  是                  是
  CObArray            否                  是                  是
  CPtrArray           否                  否                  是
  CStringArray        否                  是                  是
  CWordArray          否                  是                  是
  CUIntArray          否                  否                  是
  CList               是                  是                  是
  CtypedPtrList       是                  可能                是
  Coblist             否                  是                  是
  CStringList         否                  是                  是
  4.几点说明
  (1) 有些集合类是从c++模板支持的,如CArray,CList,使用时必须指出所要收集对象的类型,比如int,char,CPoint等,可以参考一下c++模板的知识。
  (2)在表中有2个“可能“,因为CTypedPtrArray,CTypedPtrList这些类在使用时要指定基类,如果基类可以串行化,那么它就可以串行化。
  (3)在深入浅出MFC中,作者说CUIntArray是可以串行化的,但我在做项目时证明它是不可以串行化的,希望读者注意
  如一个对象类:
  Void CStudent::Serialize(CArchive &ar)
  {
  ……
  m_array.Serialize(ar);//这里m_array是CUIntArray的对象
  }
  可是运行后发现并没有成功。因此只好采用for循环:
 5.常用函数举例
  (1)数组
  如int 数组:
  CArray m_intArray;
  m_intArray.Add(15); // 添加一个元素
  CArray pArray;
  pArray.Add(CPoint(10,10));
  l 添加元素
  注意,此时开始并没有分配数组的存储空间,但是add可以动态分配空间。如果可以预计数组大小,可以先用SetSize()来分配空 间,因为如果频繁使用add,会产生内存碎片。SetSize可以增加数组元素,也可以减少,但是在减少时,并不会自动缩小保存数组数据的缓冲区,还是先 调用removeAt先把元素删掉。
  l 获得元素个数和最大下标
  GetSize():可以返回数组中元素的个数。
  GetUpperBound():返回数组中的最大下标,一般加1就和GetSize()相等。
  l 获得成员值
  一般可以用GetAt(),有时可能要强制类型转化。如:
  CObArray array;
  Cline *pline=new Cline(100,100,200,200);//Cline为直线类,用起点和终点坐标初始化
  array.Add(pline);//此处存储的只是一个地址
  Cline *p=(Cline*)array.GetAt(0);//必须强制类型转换
  注意这里必须使用new动态创建内存空间。如果是局部变量,等到函数结束,就不能够再通过数组来引用这块内存了,因为已经析构。
  当然也可以不用类型转化。此时可以用集合类CTypedPtrArray,例如
  CTypedPtrArray
  Cline *pline=new Cline(100,100,200,200);//Cline为直线类,用起点和终点坐标初始化
  array.Add(pline);
  Cline *p=array.GetAt(0);//不用强制类型转换
  l 修改成员值
   一般可以使用函数SetAt(),但是在修改之前,这个元素的内存空间必须已经分配,比如下面这样写是错误的:
  CUIntArray Array;
  Array.SetAt(0,10) ;//想把第一项修改为10;
  可以这样写来修改元素的值:
  CUIntArray Array;
  Array.Add(5) ;
  Array.SetAt(0,10) ;//把第一项5修改为10;
  另外用数组成员引用符号[]来表示也可以来修改或者是获得元素值。
  CUIntArray Array;
  Array.Add(5) ;
  Array[0]=5 ;//把第一项5修改为10;
  同样这样写是错误的:
  CUIntArray Array;
  Array.Add(5) ;
  Array.GetAt(0)=5 ;//想把第一项5修改为10;
  l 删除元素
  RemoveAt():删除一个元素,删除后,数组中的索引号会自动改变。
  RemoveAll():删除所有元素。
  注意如果要同时删除几个元素,必须从后面删除起。
  比如:
  CUIntArray Array;
  Array.Add(5) ;
  Array.Add(10);
  Array.Add(13);
  Array.RemoveAt(0);
  Array.RemoveAt(1);
  本来是要删除第1个元素和第二个元素,但结果却是把第一个元素和第三个元素删除了,因为当调用Array.RemoveAt(0);删除第一个元素后,索引号开始变化,元素10成为索引要从1变为0,而元素13的索引号从2变为1。解决这个问题可以从后面开始删除:
  CUIntArray Array;
  Array.Add(5) ;
  Array.Add(10);
  Array.Add(13);
  Array.RemoveAt(1);
  Array.RemoveAt(0);
  只是改变了顺序,效果却大不相同哦!
  (2)链表

  l 添加成员
  Clist m_intlist="" ;="">
  m_intlist.AddTail(36) ;//在尾部添加
  m_intlist.AddHead(34) ;//在头部添加
  l 遍历
  POSITION pos=m_intlist.GetHeadPosition() ;
  While(pos !=NULL)
  {
  int i=m_intlist.GetNext(pos) ;
  …
  }//数组中有索引号,要方便一些。
  其他用法数组差不多,不作介绍。
  6.动态创建的含义
  举例说明:
  还是有个直线类,现在要串行化保存。
  l 添加元素
  Cline *line =new Cline(100,100,200,200);
  m_array.Add(line); //CObArray m_array; 类中的成员变量
  l
  在文档类中保存和读取
  Void CMyDocument::Serialize(CArchive &ar)
  {
  m_array.Serialize(ar);
  }
  实际上在m_array.Serialize(ar);的内部实现用到了for循环,一个一个元素的存储和读取的。
  前面已经说过line必须是动态分配空间的,所以存储是可以理解的。但是如果关闭这个程序,所有内存全部释放,此时再次运行程序,打开文件,肯定会调用m_array.Serialize(ar);,在内部又是采用for循环一个一个读取,但是这里并我并没有动态分配空间,它从磁盘读 取的内容(Cline)到底存在哪里啊?
  在深入浅出MFC中给出了很好的说明。在调用CArchive中这个重载符号”>>”,也就是读取时,内部会再次调用一系列的函数,有一个是CreateObject(),它的代码就是
  CObject *Cline ::CreateObject()
  {
  return new Cline;
  }
  一切释然!你可能会问CreateObject这个函数在哪里定义的?没有显示定义啊!一切定义都在这2宏中:DECLARE_SERIAL和IMPLEMENT_SERIAL,更详细的内容请参考深入浅出MFC,一切秘密都在其中!!!


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/huanjieshuijing/archive/2008/12/13/3511157.aspx

分享到:
评论

相关推荐

    CStudent应用程序(MFC集合类与串行化)

    CStudent应用程序(MFC集合类与串行化)

    基于MFC链表类CList的使用例程

    本资源是基于MFC集合类中链表类CList的简单应用,适用于VC++编程开发小白使用,对于加深对MFC集合类的理解很有帮助!

    VC++集合类,详细例子。

    MFC 集合类可以按形态和设计方案来分类。MFC 为三种类型的集合形态提供了类: 列表 数组 映射 MFC 还提供三种类型的设计方案: 不使用 C++ 模板。 使用由简单元素组成的基于 C++ 模板的集合。 使用由类型...

    MFC_ACCOUNT_CAT.zip

    1、编程要求 1) 为该程序设计一个美观大方的图标。 2) 程序界面设计合理,色彩得体大方,显示正确。...数据结构可才用MFC集合类进行存储,并对集合数据进行文件存储,文件格式可以是txt也可以是二进制文件。

    MFC Windows程序设计(第2版修订版)--源代码

    首先,本版包括7个新章节,1章用于讲解MFC视图类,1章涵盖MFC集合类;1章介绍MFC文件I/0和串行化机制,4章讨论了MFC和COM的关系。MFC不是类似活动模板库(ATL)的通用COM框架,但是MFC使编写某些COM程序更容易,使...

    Windows程序设计MFC大作业-会员管理软件源代码+报告

    题目一:会员管理软件 1、编程要求 1)为该程序设计一个美观大方的图标。...数据结构可才用MFC集合类进行存储,并对集合数据进行文件存储,文件格式可以是txt也可以是二进制文件。另:照片以文件名形式进行存储。

    MFC Windows程序设计(第2版修订版)--详细书签版2卷

    首先,本版包括7个新章节,1章用于讲解MFC视图类,1章涵盖MFC集合类;1章介绍MFC文件I/0和串行化机制,4章讨论了MFC和COM的关系。MFC不是类似活动模板库(ATL)的通用COM框架,但是MFC使编写某些COM程序更容易,使...

    Windows程序设计MFC大作业-(记账猫)源代码+实验报告

    题目三:记账猫 1、编程要求 1)为该程序设计一个美观大方的图标。 2)程序界面设计合理,色彩得体大方,显示正确...数据结构可才用MFC集合类进行存储,并对集合数据进行文件存储,文件格式可以是txt也可以是二进制文件。

    MFC Windows程序设计(第2版修订版)--详细书签版1卷

    首先,本版包括7个新章节,1章用于讲解MFC视图类,1章涵盖MFC集合类;1章介绍MFC文件I/0和串行化机制,4章讨论了MFC和COM的关系。MFC不是类似活动模板库(ATL)的通用COM框架,但是MFC使编写某些COM程序更容易,使...

    MFC程序设计集合类PPT教案学习.pptx

    MFC程序设计集合类PPT教案学习.pptx

    集合类的设计实现分析MFC.doc

    集合类的设计实现分析MFC.doc

    集合类的设计与实现(MFC).doc

    集合类的设计与实现(MFC).doc

    VC++MFC电子书集合 chm

    VC++MFC电子书 CHMCHM CHM VC++MFC电子书 CHMCHM CHMVC++MFC电子书 CHMCHM CHMVC++MFC电子书 CHMCHM CHMVC++MFC电子书 CHMCHM CHMVC++MFC电子书 CHMCHM CHMVC++MFC电子书 CHMCHM CHM

    ListControl多种扩展类集合MFC

    ListControl多种扩展类集合......................................

    深入解析MFC

    MFC的集合类 CFile家族:MFC对文件的访问 CExcephon:提供更好的错误处理 结语 第5章 CObject 使用CObject的代价 CObject的特性 宏的介绍 运行时类的信息 MFC中的持续性 CObject对诊断的支持 CObject的诊断支持内幕 ...

    MFC 列表控件(ListControl)扩展类集合(10多种)

    MFC 列表控件(ListControl)扩展类集合(10多种),其中有两个功能可以说是扩展到了极致。感兴趣的朋友不妨看看~

    MFC学生信息管理系统(集合包三类)

    包括三种不同方法实现的学生信息管理系统,具有添加、删除、查询等功能,与数据库连接,对新手练习、程序学习、毕业设计等有较大实用性

    Win32 API帮助文档以及MFC 中文类库详解

    Win 32 API和MFC 中文类库的详解的集合版。

    一份很实用的MFC资料

    1.11.6 数据集合类 17 1.11.7 通信类 18 1.12 类的消息机制 18 1.12.1 MFC如何接收一个寄送消息 18 1.12.2 MFC如何处理接收的消息 18 1.12.3 UI对象 20 1.13 小 结 20 第2章 控制条 21 2.1 通用控制条 21 2.2 用API...

Global site tag (gtag.js) - Google Analytics