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中取元素,进行复制时,需要考虑重载类对象的赋值运算符。
- CArray正确使用
- CArray的使用
- CArray的使用
- 如何使用CArray
- CArray使用一点
- CArray如何使用
- CArray 的使用
- CArray的使用
- CArray,CStringArray的使用
- CArray如何使用
- C++ CArray的使用
- CArray使用qsort排序
- MFC CArray类使用
- MFC的CArray使用
- CArray和CMap使用
- MFC CArray使用详解
- CArray
- CArray
- 计算IP地址
- Node.js快速入门
- C++程序设计实践学材系列(11)——1.2.3 见识编程中的“低级”错误
- 关于mysql函数GROUP_CONCAT
- Google Map API v2的定位
- CArray正确使用
- 截取列表内过程标题name方法(java)
- 0-1背包问题
- C++程序设计实践学材系列(10)——1.2.2 在Code::Blocks下编辑、运行第一个程序
- ibatis+spring+cxf+mysql搭建webservice
- 实用的Http工具类
- Android SqlList的应用
- HTML中单位em和px
- C++程序设计实践学材系列(9)——1.2.1 下载、安装Code::Blocks