CArray

来源:互联网 发布:淘宝上祛痘产品哪个好 编辑:程序博客网 时间:2024/04/29 20:31


template < class TYPE, class ARG_TYPE = const TYPE& >class CArray :   public CObject

Parameters

TYPE
Template parameter specifying the type of objects stored in the array. TYPE is a parameter that is returned byCArray.
ARG_TYPE
Template parameter specifying the argument type used to access objects stored in the array. Often a reference toTYPE. ARG_TYPE is a parameter that is passed toCArray.

Remarks

The CArray class supports arrays that are are similar to C arrays, but can dynamically shrink and grow as necessary.

Array indexes always start at position 0. You can decide whether to fix the upper bound or allow the array to expand when you add elements past the current bound. Memory is allocated contiguously to the upper bound, even if some elements are null.

As with a C array, the access time for a CArray indexed element is constant and is independent of the array size.

Tip   Before using an array, useSetSize to establish its size and allocate memory for it. If you do not useSetSize, adding elements to your array causes it to be frequently reallocated and copied. Frequent reallocation and copying are inefficient and can fragment memory.

If you need a dump of individual elements in an array, you must set the depth of theCDumpContext object to 1 or greater.

Certain member functions of this class call global helper functions that must be customized for most uses of theCArray class. See the topicCollection Class Helpers in the MFC Macros and Globals section.

Array class derivation is similar to list derivation.

For more information on using CArray, see the article Collections.

Requirements

Header: afxtempl.h

CArray数组对象  CArray <CPoint,CPoint&> m_Array;
    模板类CArray有两个参数,第一个参数为数组元素的类型,上面为CPoint类型,即m_Array是CPoint数组;第二个参数为引用类型,一般有两种选择,一种选择与第一个参数类型相同,它意味着数组对象作为参数传递时,传递的是数组对象。第二种选择是第一个参数类型的引用,“&”,它意味着数组对象作为参数传递时,传递的是数组对象的指针。因此,尤其对于较复杂的数组结构类型,推荐使用引用传递,节约内存同时加快程序运行速度。
    在使用CArray数组前,最好先使用SetSize确定其大小并申请存储空间。如果不这样做,向数组中增加元素时,需要不断地移动和拷贝元素造成运行的 低效率和内存碎块。

m_Array.SetSize(10,10);
SetSize函数设定数组的大小,该函数有两个参数,第一个参数设定数组的大小;第二个参数设定数组增长时内存分配的大小,缺省值是-1,使用缺省值可以保证内存分配得更加合理。本例中第二个参数是10,意即增加一个数组元素会分配10个元素大小的内存供数组使用。您可以随时使用SetSize函数设定数组的大小,如果第一个参数值小于数组已有成员数量,多于第一个参数值的成员将被截去并释放相应内存。

CArray 是一个可以存放任何数据类型的复杂的数组结构,并可以实现数组的动态管理,在内存中的地 址分配是连续的,可以提高程序的效率。在 MFC 中还提供了常用的变量类型,分别定义为 CByteArray 、 CWordArray、 CUIntArray 、 CDWrodArray 、 CStringArray 、 CobArray 、 CPtrArray 。

(1)       利用数组类模板,定义 CPoint 类型的数组类,例如:

CArray <CPoint, CPoint&> m_Array; 该语句定义一个 CArray 数组对象,模板类 CArray 有两个参数,第一个是数组元素的类型,第二是参数的引用类型,一般有两种选择,一种与第 一人参数类型相同,它意味着数组对象作为参数传递时,传递的是数组对象。第二种选择是第一个参数类型的引用,它意味着数组对象作为参数传递时,传递的是数 组对象的指针。

(2)       设定数组的大小。

一般而言,使用数组类时,最好使用 SetSize 函数设定数组的大小并申请内存空间。例如:

m_Array.SetSize(0, 1); 设定数组的大小,第一个参数设定数组的大小,第二参数设定数组增长时内存分配的大小,缺 省值是 -1 ,使用缺省值可以保证内存分配更加合理。本例中是 1 ,意思是增加一个数组元素会分配1 个元素大小的内存供数组使用。如果第一个参数值小于数组已有成员数量,大于第一个参数值 的成员将被截去并释放相应内存。

(3)       获取数组的大小。

可以使用 CArray 类的 GetSize 函数获取数组的大小,例如: int nSize = m_Array.GetUpperBound(); 由于数组值从 0 开始,所以它的值比 GetSize() 函数得到的值小 1 。如果 GetUpperBound() 返回值为 -1 ,则表明该数组中不存在元素。

(4)       常用 CArray 数组类成员函数。

<!-- @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} @list l0 {mso-list-id:188422189; mso-list-type:hybrid; mso-list-template-ids:-1420382390 2110408390 1228049680 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-text:%1、; mso-level-tab-stop:18.0pt; mso-level-number-; margin-left:18.0pt; text-indent:-18.0pt; color:windowtext;} @list l0:level2 {mso-level-text:(%2); mso-level-tab-stop:57.0pt; mso-level-number-; margin-left:57.0pt; text-indent:-36.0pt;} @list l1 {mso-list-id:1260716413; mso-list-type:hybrid; mso-list-template-ids:1725736636 -1357092342 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l1:level1 {mso-level-text:%1、; mso-level-tab-stop:18.0pt; mso-level-number-; margin-left:18.0pt; text-indent:-18.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} -->

Add

在数组的最后增加一个数组元素。

GetSize

取得数组中包含的元素个数。

RemoveAll

删除数线中的所有元素。

GetAt

获取数组内指定位置处的值。

int CArray<TYPE, ARG_TYPE>::Add(ARG_TYPE newElement

Add函数使用的参数是模板参数的二个参数,也就是说,这个参数的类型是我们来决定的,可以使用Object或Object&的方式。熟悉C++的朋友都知道,传引用的效率要高一些。如果是传值的话,会在堆栈中再产生一个新的对象,需要花费更多的时间。下面来分析一下Add函数的代码:template<class TYPE, class ARG_TYPE>AFX_INLINE int CArray<TYPE, ARG_TYPE>::Add(ARG_TYPE newElement){int nIndex = m_nSize;SetAtGrow(nIndex, newElement);return nIndex; }它实际是通过SetAtGrow函数来完成这个功能的,它的作用是设置指定元素的值。下面是SetAtGrow的代码:template<class TYPE, class ARG_TYPE>void CArray<TYPE, ARG_TYPE>::SetAtGrow(int nIndex, ARG_TYPE newElement){if (nIndex >= m_nSize)SetSize(nIndex+1, -1);m_pData[nIndex] = newElement;}

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

参数 
TYPE 
模板参数指定存储在数组中的对象的类型。TYPE是一个由CArray返回的参数。ARG_TYPE 
模板参数指定用于访问存储在数组中对象的参数类型。通常是一个对TYPE的参考。ARG_TYPE是一个传递给CArray的参数。 
说明 
CArray类支持与CArray相似的数组,但是必要时可以动态压缩并扩展。数组索引从0开始。可以决定是固定数组上界还是允许当添加元素时扩展当前的边界。内存对上界是连续地分配空间,甚至一些元素可为空。和CArray一样,CArray索引元素的访问时间是不变的,与数组大小无关。 

提示   
在使用一个数组之前,使用SetSize建立它的大小和为它分配内存。如果不使用SetSize,则为数组添加元素就会引起频繁地重新分配和拷贝。频繁地重新分配和拷贝不但没有效率,而且导致内存碎片。 
如果需要一堆数组中的个别数据,必须设置CDumpContext对象的深度为1或更大。 
此类的某成员函数调用全局帮助函数,它必须为CArray的大多数使用而定制。请参阅宏和全局量部分中的“类收集帮助器”。当从一个CArray对象中移去元素时,帮助函数DestructElements被调用。当添加元素时,帮助函数ConstructElements被调用。数组类的派生与列表的派生相似。如果要了解关于使用CArray的更多信息,请参阅联机文档“Visual C++程序员指南”中的“收集”。 
#include<afxtempl.h> 
请参阅   CObArray,DestructElement,ConstructElements,Collection ClassHelpers 

CArray类的成员 
构造函数 
Carray构造一个空数组 
属性 
GetSize获得此数组中的元素数 
GetUpperBound返回最大的有效索引值 
SetSize设置包含在此数组中的元素数 
操作 
FreeExtra释放大于当前上界的未使用的内存 
RemoveAll从此数组移去所有元素 
元素访问 
GetAt返回在给定索引上的值 
SetAt设定一个给定索引的值;数组不允许扩展 
ElementAt返回一个对数组中元素指针的临时参考 
GetData允许对数组中的元素访问。可以为NULL 
扩展数组 
SetAtGrow为一个给定索引设置值;如果必要,扩展数组 
Add在数组的末尾添加元素;如果必要,扩展数组 
Append在数组上附加另一个数组;如果必要,扩展数组 
Copy把另一个数组拷贝到数组上;如果必要,扩展数组 
插入/移去 
InsertAt在指定的索引上插入一个元素(或另一个数组中的所有元素) 
RemoveAt在指定的索引上移去一个元素 
运算符 
[ ]在特定索引上设置或获取元素 

成员函数 
CArray::Add 
int Add(ARG_TYPE newElement);   
throw(CmemoryException); 
返回值 
添加元素的索引。 
参数 
ARG_TYPE 
模板参数指定应用数组中元素的参数的类型。 
newElement 
被加入此数组的元素。 
说明 
在数组的末尾加入一个新的元素,数组长度加1。如果SetSize已经使用nGrowBy值比1大,则内存按其分配。无论怎样,上界只增长1。 
示例 
//example for CArray:Add 
CArray<Cpoint.Cpoint> ptArray; 
Cpoint pt(10.20); 
ptArray.Add(pt);               
//Element 0 
ptArray.Add(Cpoint(30,40));     
//Element 1 
请参阅   CArray:SetAt,CArray::SetAtGrow,CArray::InsertAt,CArray::operator[] 

CArray::Append 
int Append(const CArray& src); 
返回值 
第一个附加元素的索引。 
参数 
src附加到数组的元素的源。 
说明 
调用此成员函数将一个数组的内容附加到另一个数组的末尾。数组必须是同一种类型。如果必要,Append将分配更多的内存来存储附加到数组上的元素。 
请参阅   CArray::Copy 

CArray::CArray 
CArray( ); 
返回值 
构造一个空数组。数组一次扩展一个元素。 
请参阅   CObArray::CObArray 

CArray::Copy 
void Copy(const CArray& src); 
参数 
Src被拷贝到数组中的元素的源。 
说明 
使用此成员函数将一个数组的元素拷贝到另一个数组中。调用此成员函数用另一个数组的元素复写数组的元素。Copy不会释放内存;但是,如果必要,Copy可以为拷贝到数组的元素分配更多的内存。请参阅   CArray::Append 

CArray::Element 
TYPE&ElementAt(int nIndex); 
返回值 
数组元素的参考。 
参数 
TYPE指定数组元素类型的模板参数。 
nIndex比0大或比0小的整数索引,并且小于或等于由GetUpperBound返回的值。 
说明 
返回一个对数组中指定元素的临时参考。它用于实现数组的左边界分配运算符。 
请参阅   CArray::operator[] 

CArray::FreeExtra 
void FreeExtra( ); 
说明 
释放任何当数组扩展时所分配的额外的内存空间。此函数不影响数组的大小和上界。 

CArray::GetAt 
TYPE GetAt(int nIndex) const; 
返回值 
当前在索引上的数组元素。 
参数 
TYPE指定数组元素类型的模板参数。 
nIndex比0大或比0小的整数索引,并且小于或等于由GetUpperBound返回的值。 
说明 
返回特定索引的数组元素。注意   传递一个负值或一个比由GetUpperBound返回值大的值将会引起失败。 
请参阅   CArray::SetAt,CArray::operator[],ConstElements 

CArray::GetData 
const TYPE* GetData( ) const;TYPE* GetData( ); 
返回值 
指向数组元素的指针。 
参数 
TYPE指定数组元素类型的模板参数 
说明 
使用此成员函数,获得对数组中元素的直接访问。如果没有元素是有效的,GetData返回一个空值。当对数组元素的直接访问可使工作更快时,当调用GetData时请使用警告,任何直接引起的错误都会影响数组元素。 
请参阅   CArray::GetAt;CArray::SetAt;CArray::ElementAt 

CArray::GetSizeint GetSize( ) const; 
说明 
返回数组的大小。既然索引基于0,所以数组的大小比最大的索引多1。 
请参阅   CArray::GetUpperBound,CArray::SetSize 

CArray::GetUpperBound 
int GetUpperBound( ) const; 
说明 
返回数组的上界。因为数组索引基于0,此函数返回值比GetbSize小1。GetUpperBound=-1的条件确定了数组中没有包含元素。 
请参阅   CArray::GetSize,CArray::SetSize 

CArray::InsertAt 
void InsertAt(int nIndex,ARG_TYPE newElement,int nCount=1);   
throw(CmemoryException); 
void InsertAt(int nStarIndex,CArray*pNewArray);   
throw(CMemoryException); 
参数 
nIndex整数值,它可以比GetUpperBound返回值大。 
ARG_TYPE指定数组元素类型的模板参数。 
newElement要被放置到数组中的元素。 
nCount此元素应被插入的次数(缺省为1)。 
nStarIndex整数索引,它可以比GetUpperBound返回值大。 
pNewArray要被加入此数组的另一个包含元素的数组。 
说明 
InsertAt的第一个版本在数组的特定索引上插入一个元素(或元素的多个拷贝)。在此过程中,移动(通过索引值的增加)此索引上原有的元素,并且移动所有在其后的元素。第二个版本由另一个CArray收集插入所有元素,从nStartIndex位置开始。SetAt函数替换一个特定数组元素,不移动任何元素。 
示例 
//example for CArray::Insert 
CArray<Cpoint.Cpoint> ptArray; 
ptArray.Add(Cpoint(10,20));                   //Element 0 
ptArray.Add(Cpoint(30,40));                   //Element 1(will become element 2) 
ptArray.InsertAt(1,Cpoint(50,60));              //New element 1 
请参阅   GetUpperBound,CArray::SetAt,CArray::RemoveAt 

CArray::RemoveAll 
void RemoveAll( ); 
说明 
从此数组中移去所有元素。如果数组已经为空,此函数也起作用。 

CArray::RemoveAt 
void RemoveAt(int nIndex,int nCount=1); 
参数 
nIndex整数索引。它大于或等于0并且小于或等于GetUpperBound返回值。 
nCount删除元素的数量。 
说明 
从数组指定的索引起删除一个或多个元素。在这个过程中,它将所有的元素向下移动。它减少数组的上界值,但是不释放内存。如果试图删除包含在数组中在删除点之上的多个元素,则使用库断言的调试版本。 

CArray::SetAt 
void SetAt(int nIndex,ARG_TYPE newElement); 
参数 
nIndex整数索引。它大于或等于0并且小于或等于GetUpperBound返回值。 
ARG_TYPE指定用于参考数组元素的参数类型的模板参数。 
newElement被存储在指定位置的新的元素值。 
说明 
在指定的索引设置数组元素。SetAt将不会引起数组增长。如果想让数组自动增长,请使用SetAtGrow。必须保证索引值表示的是一个数组中的有效位置。如果它超出了边界,则使用库断言的调试版本。 
请参阅   CArray::GetAt,CArray::SetGrow,CArray::ElementAt,CArray::opertor[] 

CArray::SetAtGrow 
void SetAtGrow(int nIndex,ARG_TYPE newElement);   
throw(CMemoryException); 
参数 
nIndex整数索引。它大于或等于0。 
ARG_TYPE指定数组元素类型的模板参数。 
newElement被添加在此数组的元素值。允许空值。 
说明 
在指定的索引上设置数组元素。如果必要,数组自动增长(调整上界以接纳新元素)。 
示例 
//example for CArray::SetAtGrow 
CArray<CPoint.CPoint> ptArray; 
ptArray.Add(CPoint(10,20));       //Element 0 
ptArray.Add(CPoint(30,40));       //Element 1                              //Element 2 deliberately skipped 
ptArray.SetAtGrow(3,CPoint(50,60));//Element 3 
请参阅   CArray::GetAt,CArray::SetAt,CArray::Element,CArray::oprator[] 

CArray::SetSize 
void SetSize(int nNewSize,int nGrowBy=-1);   
throw(CMemoryException); 
参数 
nNewSize新的数组大小(元素的个数)。必须大于或等于0。 
nGrowBy如果有必要扩展数组大小时,这是要分配的元素位置的最小值。 
说明 
建立一个空的或已存在数组的大小;如果必要,则分配内存。如果新的大小比以前的大小的话,则数组被截短并且所有未使用的内存被释放。在开始使用数组之前,使用此函数设置数组的大小。如果没有使用SetSize,则为数组添加元素就会引起频繁地重分配和拷贝。频繁地重分配和拷贝不仅无效率,而且会造成内存碎片。当数组正在扩张时,nGrowBy参数会影响内部地内存分配。正象GetSize和GetUpperBound提到地那样,它的使用不会数组大小。如果使用缺省值,则MFC分配内存会使用计算方法,避免内存碎片并加已优化,使之对大多数的情况都更有效率。 
请参阅   CArray::GetUpperBound,CArray::GetSize 

操作符 
CArray::opertor[] 
TYPE& operator[](int nIndex); 
TYPE& operator[](int nIndex) const; 
参数 
TYPE指定此数组中元素的类型的模板参数。 
nIndex被访问的元素的索引。 
说明 
这些下标运算符可方便地取代SetAt和GetAt函数。第一个运算符,不是常量的数组调用它,可以用在赋值语句的右(右值)或左(左值)边。第二个,为常量数组调用,只能用在赋值语句的右边。如果下标(一个赋值语句的左或右边)超出了边界,则使用库断言的调试版本。 
请参阅   CArray::GetAt;CArray::SetAt;CArray::ElementAt
原创粉丝点击