MFC 中动态数组 CArray 的使用
数组——这个 C 语言中的怪物,自从被直接继承到 C++中,便让无数有识之士们前赴后
继、绞尽脑汁,试图寻找一种可以动态增长的替代数据类型。当然,最著名的,应该就是
vector 向量。但是,它的数据定义极其复杂,还有迭代的出现,几乎彻底摧毁了它仅存的一
点优势。所以,引入 MFC 之后,微软斩钉截铁地抛弃了标准 C++的模板库。
CArray 是 MFC 中非常重要的几个类模板之一,其他的还有 CList、CMap 等,但它们的
定义略微有点晦涩。以我自己的经验,在 MFC 中使用 CArray 定义动态数组是非常方便的。
在 MSDN 中,CArray 的声明如下:
template< class TYPE, class ARG_TYPE > class CArray : public CObject
参数
TYPE
模板参数,指定存储在数组中对象的类型。TYPE 是 CArray 返回的参数类型。
ARG_TYPE
模板参数,指定用来访问存储在数组中对象的变量类型,通常是 TYPE 的引用。ARG_TYPE
是传递给 CArray 的参数类型。
备注
CArray 类支持与 C 中相似的数组,但是必要时可以动态收缩和增长。数组索引总是从 0
开始。你可以决定是固定数组上界还是允许当添加元素超过当前边界时扩展数组。内存 被连
续地分配到上界,即使一些元素可能为空。和 C 中数组一样,CArray 索引元素的访问时间
是不变的,与数组大小无关。
提示 在使用一个数组之前,使用 SetSize 建立它的大小和为它分配内存。如果不使用
SetSize,则为数组添加元素就会引起频繁地重新分配和拷贝。频繁地重新分配和拷贝不但没
有效率,而且会导致内存碎片。
如果需要一堆数组中的个别数据,必须设置 CDumpContext 对象的深度为 1 或更大。
此类的某些成员函数调用全局帮助函数,它必须为 CArray 的大多数使用而定制。请参
阅宏和全局量章节中的 Collection Class Helpers。
当从一个 CArray 对象中移去元素时,帮助函数 DestructElements 被调用。当添加元素时,
帮助函数 ConstructElements 被调用。
数组类的派生与列表的派生类似。
有关使用 CArray 类的更多信息,请参考 Visual C++ Programmer's Guide 中的论文集。
#include <afxtempl.h>
看到上面这么一大段文字是不是觉得有点头晕?MSDN 就是这样的,不然怎么能体现出
它的“权威”呢。其实不要觉得它很复杂,使用 CArray 类构造动态数组非常简单。首先,
你需要包含头文件 Afxtempl.h,然后就可以定义自己的动态数组了。例如定义一个 int 型和
CPoint 型的动态数组:
#include <afxtempl.h>
CArray <int, int> num;
CArray <CPoint, CPoint&> pt; // 也可以这样:CArray <CPoint, CPoint> pt;