CArray正确使用

昨天在论坛逛,就看见了有人再问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:
// 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使用

向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;
}


执行结果:

CArray正确使用_第1张图片

 

说明:

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

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

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

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

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

 

你可能感兴趣的:(CArray正确使用)