CLKing31-----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>=
————————————————
版权声明:本文为CSDN博主「tanshaojun」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tanshaojun/article/details/4370302

猜你喜欢

转载自blog.csdn.net/qq_43662480/article/details/114471566
今日推荐