CArray正确使用

来源:互联网 发布:传奇霸业轮回系统数据 编辑:程序博客网 时间:2024/04/29 18:11

昨天在论坛逛,就看见了有人再问CArray如何使用,最后我觉得lz都没有真正的领会微笑

今天就刨析以下CArray的用法,从MSDN的叙述来看,使用很简单,叙述很清楚,为什么好多人会使用错,我觉得原因是C++基础不牢靠。

 

(一)MSDN中CArray的叙述

CArray是继承于CObject类,类模板如下:

template< class TYPE, class ARG_TYPE > class CArray : public CObject


各参数含义

TYPE

指定存储在CArray数组中对象的类型,这个类型参数是用于从CArray中获取值。

ARG_TYPE

指定用于访问存储在CArray数组中元素的类型,经常是一个TYPE的一个引用,这个类型的参数是用于传值于CArray。

 

说明:CArray类是类似于C语言中索引是以0开始的的数组,但它可以自动增长,并且增长与否我们可以控制。另外,我们再使用时最好给CArray一个初始大小(各项目经验值),这样能保证其,自动分配的频率降级,提高程序的效率。

 

(二)CArray类

先看一下CArray类的定义,方便我们更了解使用它

/////////////////////////////////////////////////////////////////////////////// CArray<TYPE, ARG_TYPE>template<class TYPE, class ARG_TYPE>class CArray : public CObject{public:// ConstructionCArray();// Attributesint GetSize() const;int GetUpperBound() const;void SetSize(int nNewSize, int nGrowBy = -1);// Operations// Clean upvoid FreeExtra();void RemoveAll();// Accessing elementsTYPE GetAt(int nIndex) const;void SetAt(int nIndex, ARG_TYPE newElement);TYPE& ElementAt(int nIndex);// Direct Access to the element data (may return NULL)const TYPE* GetData() const;TYPE* GetData();// Potentially growing the arrayvoid SetAtGrow(int nIndex, ARG_TYPE newElement);int Add(ARG_TYPE newElement);int Append(const CArray& src);void Copy(const CArray& src);// overloaded operator helpersTYPE operator[](int nIndex) const;TYPE& operator[](int nIndex);// Operations that move elements aroundvoid InsertAt(int nIndex, ARG_TYPE newElement, int nCount = 1);void RemoveAt(int nIndex, int nCount = 1);void InsertAt(int nStartIndex, CArray* pNewArray);// Implementationprotected:TYPE* m_pData;   // the actual array of dataint m_nSize;     // # of elements (upperBound - 1)int m_nMaxSize;  // max allocatedint m_nGrowBy;   // grow amountpublic:~CArray();void Serialize(CArchive&);#ifdef _DEBUGvoid Dump(CDumpContext&) const;void AssertValid() const;#endif};/////////////////////////////////////////////////////////////////////////////


 

相关方法的使用可以去查MSDN,这里说一下的它的成员变量含义:

TYPE* m_pData;   // 数据保存地址的指针
int m_nSize;           // 用户当前定义的数组的大小
int m_nMaxSize;    // 当前实际分配的数组的大小
int m_nGrowBy;    // 分配内存时增长的元素个数


(三)CArray使用

向CArray中添加整数元素,代码如下:

// CArrayDemo.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "CArrayDemo.h"#include <afxtempl.h>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// The one and only application objectCWinApp theApp;using namespace std;void AddToArray(CArray <int, int>   &array1,CArray <int, int&>  &array2,CArray <int*, int*> &array5){int nItem = 9;TRACE1("nItem = %d\n", nItem);TRACE1("&nItem = %08X\n", &nItem);array1.Add(nItem);array2.Add(nItem);//array3.Add(nItem);//array4.Add(nItem);array5.Add(&nItem);}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){int nRetCode = 0;CArray <int, int>   array1;CArray <int, int&>  array2;  //CArray <int, int*>  array3; //error declare  //CArray <int&, int&> array4; //error declareCArray <int*, int*> array5;AddToArray(array1, array2, array5);    TRACE1("array1[0] = %d\n", array1[0]);TRACE1("&array1[0] = %08X\n", &array1[0]);TRACE1("array2[0] = %d\n", array2[0]);TRACE1("&array2[0] = %08X\n", &array2[0]);TRACE1("array5[0] = %08X\n", array5[0]);TRACE1("&array5[0] = %08X\n", &array5[0]);TRACE1("*array5[0] = %d\n", *array5[0]);return nRetCode;}


执行结果:

 

说明:

1.以上代码中array3和array4声明是不正确的,正确的申明格式array1,array2和array5。

2.由(二)中CArray类定义中函数Add的原形,我们知道array2的效率要高于array1

3.*array5[0] = -858993460是因为插入了临时变量指针导致的,nItem出了函数AddToArray就被回收了。

4.如果CArray中存储的是类对象,向array1中添加元素,需要考虑类对象的拷贝构造函数。

5.如果CArray中存储的是类对象, 从array1和array2中取元素,进行复制时,需要考虑重载类对象的赋值运算符。

 

8 0
原创粉丝点击