两个很常用的类CArray,CList

两个很常用的类CArray,CList

开始用过CArray这个非常好用的类(如何使用看这篇文章MFC数组类CArray的使用的操作详解 )。后来又发现CList这个类与它有些相似,于是Google了一下。在这里汇总一些比较好理解的说法去熟悉他们。以便在以后的编程中应用自如:

 

Title Array采用队列方式存储数据,因而其内部数据元素是以物理方式顺序排列的,所以检索、顺序执行GetAt()等函数的速度是相当快的。但是由于每次队列长度变化后,数据都要重新申请内存、拷贝内存、释放内存,因而Insert/Add/RemoveAt()的速度都很慢。如果你使用的数据元素尺寸相当大,而且数组的操作相当复杂,频繁使用InsertAt/SetAt/RemoveAt等,应该考虑使用CList来代替。但是如果考虑Array中存储指针而不是数据本身,效率也可以接受。   
    
  List采用链表方式存储数据,因而当链表数据有所变动时,只做了一下指向变动,所以即使数据元素非常多单个数据元素也很大,执行Insert/Add/Remove的速度都很快,但是因为没有统一的Index,因而如果要找到某个元素只有遍历整个链表。整体上说,List的使用比较繁琐,特别为小尺寸数据设计List更是得不偿失的,这也是为什么有CWordArray而没有CWordList的原因,因而在大多数情况下应该有限考虑是否可以使用Array来存储数据。     
  使用什么主要看你的使用要求了  

 

Title CArray       CArray   提供了规则数组不具备的灵活性,但是程序可能不需要它。如果知道数组的特定限制,反而可以使用全局固定数组。如果使用   CArray,当需要重新分配时,使用   CArray::SetSize   建立它的大小并指定增长的元素数。否则,添加元素可能导致数组经常重新分配和复制,这样做效率很低而且可能产生内存碎片。还需注意的是,如果将一项插入数组中,则   CArray   移动内存中后面的项并且可能需要增长数组。这些操作可能导致缓存未命中和页错误。如果浏览   MFC   使用的代码,可能会明白可编写一些更特定于方案的东西以提高性能。例如,由于   CArray   是一个模板,可以提供特定类型的   CArray   专用化。   
  CList       CList   是双向链接表,因此头、尾和表中已知位置   (POSITION)   的元素插入速度很快。按值或者索引查找需要顺序搜索,然而如果表很长则速度可能慢。如果代码不要求双向链接表,可能需要重新考虑使用   CList。使用单向链接表可省去更新所有操作的附加指针以及该指针的内存的系统开销。这种附加内存不太好,但却是解决缓存未命中或页错误的另一种可能的方法。

 

Title

简单数组和列表的用法   
  简单的数组类   CArray   和列表类   CList   采用两个参数:TYPE   和   ARG_TYPE。这些类可以存储任何在   TYPE   参数中指定的数据类型:     
  基本   C++   数据类型,如   int、char   和   float     
  C++   结构和类     
  定义的其他类型     
  考虑到方便性和效率,可以使用   ARG_TYPE   参数来指定函数参数的类型。通常情况下,将   ARG_TYPE   指定为对   TYPE   参数中命名类型的引用。例如:   
  CArray<int,   int>   myArray;   
  CList<CPerson,   CPerson&>   myList;   
  第一个示例声明了一个包含多个   int   的数组集合   myArray。第二个示例声明了一个存储   CPerson   对象的列表集合   myList。集合类的某些成员函数采用其类型由   ARG_TYPE   模板参数指定的参数。例如,CArray   类的   Add   成员函数采用   ARG_TYPE   参数:   
  CArray<CPerson,   CPerson&>   myArray;   
  CPerson   person;   
  myArray->Add(   person   );  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值