五、C++中CArray动态数组的使用

CArray 是一个可以存放任何数据类型的复杂的数组结构,并可以实现数组的动态管理,在内存中的地址分配是连续的,可以提高程序的效率。在 MFC 中还提供了常用的变量类型,分别定义为 CByteArray CWordArray CUIntArray CDWrodArray CStringArray CobArray CPtrArray

(1)       利用数组类模板,定义 CPoint 类型的数组类,例如:

CArray <CPoint, CPoint&> m_Array; 该语句定义一个 CArray 数组对象,模板类 CArray 有两个参数,第一个是数组元素的类型,第二是参数的引用类型,一般有两种选择,一种与第一人参数类型相同,它意味着数组对象作为参数传递时,传递的是数组对象。第二种选择是第一个参数类型的引用,它意味着数组对象作为参数传递时,传递的是数组对象的指针。

(2)       设定数组的大小。

一般而言,使用数组类时,最好使用 SetSize 函数设定数组的大小并申请内存空间。例如:

m_Array.SetSize(0, 1); 设定数组的大小,第一个参数设定数组的大小,第二参数设定数组增长时内存分配的大小,缺省值是 -1 ,使用缺省值可以保证内存分配更加合理。本例中是 1 ,意思是增加一个数组元素会分配 1 个元素大小的内存供数组使用。如果第一个参数值小于数组已有成员数量,大于第一个参数值的成员将被截去并释放相应内存。

(3)       获取数组的大小。

可以使用 CArray 类的 GetSize 函数获取数组的大小,例如: int nSize = m_Array.GetUpperBound(); 由于数组值从 0 开始,所以它的值比 GetSize() 函数得到的值小 1 。如果 GetUpperBound() 返回值为 -1 ,则表明该数组中不存在元素。

(4)       常用 CArray 数组类成员函数。

<!-- @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} @list l0 {mso-list-id:188422189; mso-list-type:hybrid; mso-list-template-ids:-1420382390 2110408390 1228049680 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-text:%1、; mso-level-tab-stop:18.0pt; mso-level-number-; margin-left:18.0pt; text-indent:-18.0pt; color:windowtext;} @list l0:level2 {mso-level-text:(%2); mso-level-tab-stop:57.0pt; mso-level-number-; margin-left:57.0pt; text-indent:-36.0pt;} @list l1 {mso-list-id:1260716413; mso-list-type:hybrid; mso-list-template-ids:1725736636 -1357092342 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l1:level1 {mso-level-text:%1、; mso-level-tab-stop:18.0pt; mso-level-number-; margin-left:18.0pt; text-indent:-18.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} -->

Add

在数组的最后增加一个数组元素。

GetSize

取得数组中包含的元素个数。

RemoveAll

删除数线中的所有元素。

GetAt

获取数组内指定位置处的值。

int CArray<TYPE, ARG_TYPE>::Add(ARG_TYPE newElement

Add函数使用的参数是模板参数的二个参数,也就是说,这个参数的类型是我们来决定的,可以使用Object或Object&的方式。熟悉C++
的朋友都知道,传引用的效率要高一些。如果是传值的话,会在堆栈中再产生一个新的对象,需要花费更多的时间。
下面来分析一下Add函数的代码:
template<class TYPE, class ARG_TYPE>
AFX_INLINE int CArray<TYPE, ARG_TYPE>::Add(ARG_TYPE newElement)
{
int nIndex = m_nSize;
SetAtGrow(nIndex, newElement);
return nIndex;
}
它实际是通过SetAtGrow函数来完成这个功能的,它的作用是设置指定元素的值。下面是SetAtGrow的代码:
template<class TYPE, class ARG_TYPE>
void CArray<TYPE, ARG_TYPE>::SetAtGrow(int nIndex, ARG_TYPE newElement)
{
if (nIndex >= m_nSize)
SetSize(nIndex+1, -1);
m_pData[nIndex] = newElement;
}
SetAtGrow的实现也很简单,如果指定的元素已经存在,就把改变指定元素的值。如果指定的元素不存在,也就是 nIndex>=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CArrayMFC(Microsoft Foundation Class)库的一个容器类,用于存储一组相同类型的元素。 以下是CArray的基本用法: 1. 包含头文件: ```cpp #include <afxtempl.h> ``` 2. 定义CArray对象: ```cpp CArray<数据类型, 数据类型&> 数组名; ``` 其,数据类型为要存储的元素类型,数据类型&为元素类型的引用类型,数组名为定义的数组的名称。 例如: ```cpp CArray<int, int&> myArray; ``` 3. 使用Add函数向数组添加元素: ```cpp myArray.Add(元素值); ``` 例如: ```cpp myArray.Add(1); myArray.Add(2); myArray.Add(3); ``` 4. 使用GetAt函数获取数组指定位置的元素值: ```cpp myArray.GetAt(位置); ``` 例如: ```cpp int num = myArray.GetAt(0); // 获取数组第一个元素的值 ``` 5. 使用SetAt函数设置数组指定位置的元素值: ```cpp myArray.SetAt(位置, 新元素值); ``` 例如: ```cpp myArray.SetAt(0, 10); // 将数组第一个元素的值修改为10 ``` 6. 使用GetSize函数获取数组元素的个数: ```cpp int size = myArray.GetSize(); ``` 例如: ```cpp int size = myArray.GetSize(); // 获取数组元素的个数 ``` 7. 使用RemoveAll函数清空数组的所有元素: ```cpp myArray.RemoveAll(); ``` 8. 使用RemoveAt函数删除数组指定位置的元素: ```cpp myArray.RemoveAt(位置); ``` 例如: ```cpp myArray.RemoveAt(0); // 删除数组第一个元素 ``` 以上就是CArray的基本用法。需要注意的是,CArrayMFC的类,只能在Windows平台上使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值