五、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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值