昨天在论坛逛,就看见了有人再问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
template
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
#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 &array1,
CArray &array2,
CArray &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 array1;
CArray array2;
//CArray array3; //error declare
//CArray array4; //error declare
CArray 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中取元素,进行复制时,需要考虑重载类对象的赋值运算符。