MFC中动态数组CArray的使用.pdf
文本预览下载声明
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++ Programmers 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;
现在,我们构造了两个动态数组,按照MSDN 的提示,我们要使用SetSize 函数建立它
的大小和分配内存。(但其实这一步可以省略,而且我自己就是这么做的,虽然这不符合一
个规范程序员的风格。)SetSize 的函数原型是:
void SetSize( int nNewSize, int nGrowBy = -1 );
这个函数在 MSDN 中也有详细的说明,我就不再去翻译了。其中第一个参数指定数组
大小,即数组中元素个数(必需大于或等于0 )。对于第二个参数,MSDN 中有这样一句话:
如果使用了默认值,MFC 以一种在大多数情况下能够避免内存碎片和最高效的方式去分配
内存。既然人家 MSDN 都这么说了,那我们第二个参数就使用它的默认值了。如果要加上
这一步的话,可以这么写(我们先不写):
num.SetSize(40); // 其实大小设为多少没有关系,只要是你认为最合适的就行了
pt.SetSize(10); // 一般地,设得大些可以避免内存碎片和提高效率,但所需空间越大
现在我们可以使用Add 函数向数组中添加一个元素,也可以用GetAt 函数来获得一个元
素。它们的
显示全部