昨天在论坛逛,就看见了有人再问CArray如何使用,最后我觉得lz都没有真正的领会。
今天就刨析以下CArray的用法,从MSDN的叙述来看,使用很简单,叙述很清楚,为什么好多人会使用错,我觉得原因是C++基础不牢靠。
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<TYPE, ARG_TYPE> template<class TYPE, class ARG_TYPE> class CArray : public CObject { public: // Construction CArray(); // Attributes int GetSize() const; int GetUpperBound() const; void SetSize(int nNewSize, int nGrowBy = -1); // Operations // Clean up void FreeExtra(); void RemoveAll(); // Accessing elements TYPE 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 array void SetAtGrow(int nIndex, ARG_TYPE newElement); int Add(ARG_TYPE newElement); int Append(const CArray& src); void Copy(const CArray& src); // overloaded operator helpers TYPE operator[](int nIndex) const; TYPE& operator[](int nIndex); // Operations that move elements around void InsertAt(int nIndex, ARG_TYPE newElement, int nCount = 1); void RemoveAt(int nIndex, int nCount = 1); void InsertAt(int nStartIndex, CArray* pNewArray); // Implementation protected: TYPE* m_pData; // the actual array of data int m_nSize; // # of elements (upperBound - 1) int m_nMaxSize; // max allocated int m_nGrowBy; // grow amount public: ~CArray(); void Serialize(CArchive&); #ifdef _DEBUG void Dump(CDumpContext&) const; void AssertValid() const; #endif }; /////////////////////////////////////////////////////////////////////////////
相关方法的使用可以去查MSDN,这里说一下的它的成员变量含义:
TYPE* m_pData; // 数据保存地址的指针
int m_nSize; // 用户当前定义的数组的大小
int m_nMaxSize; // 当前实际分配的数组的大小
int m_nGrowBy; // 分配内存时增长的元素个数
向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_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object CWinApp 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 declare CArray <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中取元素,进行复制时,需要考虑重载类对象的赋值运算符。