开始用过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 );