zoukankan      html  css  js  c++  java
  • MFC模板CArray及其派生类

    CArray及其派生类

    1. 简介:访问方法及效率和普通的数组一样,比普通数组强大的功能是可以改变数组的大小。Array采用队列方式存储数据,因而其内部数据元素是以物理方式顺序排列的,所以检索、顺序执行GetAt()等函数的速度是相当快的。但是由于每次队列长度变化后,数据都要重新申请内存、拷贝内存、释放内存,Insert/Add/RemoveAt()的速度都很慢。

       特点:通过索引(数组下标)访问的速度很快,但是插入删除操作很慢,因为插入删除操作时,是需要移动元素的。

    访问方法:通过索引访问,普通的数组怎么用,它就可以怎么用。

    2. MFC数组类CArray的使用的操作详解

    MFC的数组类支持的数组类似于常规数组,可以存放任何数据类型。常规数组在使用前必须将其定义成能够容纳所有可能需要的元素,即先确定大小,而MFC数组类创建的对象可以根据需要动态地增大或减小,数组的起始下标是0,而上限可以是固定的,也可以随着元素的增加而增加,数组在内存中的地址仍然是连续分配的。

    MFC定义了数组模板类CArray,并针对各种常用变量类型定义了CByteArray,CArray,CUIntArray,CDArray,CStringArray,CObArray,CPtrArray。

    CArray     通过模板类的参数类型设定各种类型

    CByteArray    8位无符号整数 BYTE类型

    CArray       16位无符号整数 WORD类型

    CDArray    32位无符号整数 DWORD类型

    CUIntArray     32位无符号整数 UINT类型

    CStringArray CString字符串 string字符串

    CObArray       CObject类及其派生类

    CPtrArray       void* 类型指针

    CArray

    CObject

    └CArray

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

    参数:

    TYPE 模板参数指定存储在数组中的对象的类型。TYPE是一个由CArray返回的参数。

    ARG_TYPE 模板参数指定用于访问存储在数组中对象的参数类型。通常是一个对TYPE的参考。ARG_TYPE是一个传递给CArray的参数。

    如1:CArray <CPoint,CPoint&> m_Array;

    如2:CArray<int, int>   myArray; //对于基本类型如int,char和float一般要用参数传递

    说明:

    CArray类支持与CArray相似的数组,但是必要时可以动态压缩并扩展。数组索引从0开始。可以决定是固定数组上界还是允许当添加元素时扩展当前的边界。内存对上界是连续地分配空间,甚至一些元素可为空。和CArray一样,CArray索引元素的访问时间是不变的,与数组大小无关。

    提示:

    在使用一个数组之前,使用SetSize建立它的大小和为它分配内存。如果不使用

    SetSize,则为数组添加元素就会引起频繁地重新分配和拷贝。频繁地重新分配和拷

    贝不但没有效率,而且导致内存碎片。

    中的“收集”。

    #include <afxtempl.h>

    CArray类的成员

    构造函数

    CArray

    构造一个空数组属性

    GetSize

    获得此数组中的元素数

    GetUpperBound

    返回最大的有效索引值

    SetSize

    设置包含在此数组中的元素数

    操作

    FreeExtra

    释放大于当前上界的未使用的内存

    RemoveAll

    从此数组移去所有元素元素访问

    GetAt

    返回在给定索引上的值

    SetAt

    设定一个给定索引的值;数组不允许扩展

    ElementAt

    返回一个对数组中元素指针的临时参考

    GetData

    允许对数组中的元素访问。可以为NULL扩展数组

    SetAtGrow

    为一个给定索引设置值;如果必要,扩展数组

    Add

    在数组的末尾添加元素;如果必要,扩展数组

    Append

    在数组上附加另一个数组;如果必要,扩展数组

    Copy

    把另一个数组拷贝到数组上;如果必要,扩展数组

    插入/移去

    InsertAt

    在指定的索引上插入一个元素(或另一个数组中的所有元素)

    RemoveAt

    在指定的索引上移去一个元素

    运算符

    operator []

    在特定索引上设置或获取元素

    CArray应用举例:源代码:http://download.csdn.net/detail/nuptboyzhb/4211672

     

    1.       新键一个基于对话框的应用程序,命名为CArrayTest,在 CarrayTestDlg.h文件在添加CArray的头文件#include <afxtempl.h>

    2.       为对话框新增一个成员变量:

    CArray<CPoint,CPoint&>m_PoinyArray;//保存CPoint类型的数组

    3.       在对话框的OnInitDialog()函数中初始化数组的大小和数组中的值

    int m_point_num=200;

    m_PoinyArray.SetSize(m_point_num);

    for(int i=0;i<m_point_num;i++)

    {

               CPoint tempPT;

               tempPT.x=i;

               tempPT.y=i*10;

               m_PoinyArray.SetAt(i,tempPT);

        }

    //即,点的横坐标和索引值相同,点的纵坐标是索引值的10背;

    4.       为对话框添加如下控件(详见源代码)

     

    4.1   为编辑框关联一个整型的变量index

    4.2   分别编写10个按钮的消息响应函数

     4.2.1获取

     4.2.2 删除

     4.2.3 插入

     4.2.4 设定

     4.2.5 SetAtGrow

     4.2.6 GetSize

     4.2.7 GetUpperBound

    4.2.8 Add

    4.2.9 输出全部的点

    4.2.10删除全部的点

    以上按钮,基本涵盖了CArray类的大部分成员函数;

    CArray的串行化

    CArray不需要串行化,直接调用父类的Serialize函数即可;如:

    void CGraduationDoc::Serialize(CArchive& ar)

    {

             if (ar.IsStoring())

             {

                       // TODO: add storing code here

    m_ObArray.Serialize(ar);

             }

             else

             {

                       // TODO: add loading code here

    m_ObArray.Serialize(ar);

             }

    }

    注意:CArray的成员类型,如果不是常见的可串行化的类型,则必须各自实现自己的串行化!

  • 相关阅读:
    界面控件DevExpress Blazor UI组件v20.2新版亮点:集成Visual Studio
    如何打印超长图片
    使用you-get库下载视频自动化
    数组求最值和平均数的算法
    如何删除git所有提交历史
    计算机图形学应知应会
    通过终端登录FTP服务器的方式
    局域网内通过ARP欺骗获取他人账号密码
    如何在局域网下用他人的流量上网
    XAMPP下的项目进行内网穿透时的注意点
  • 原文地址:https://www.cnblogs.com/lidabo/p/3501333.html
Copyright © 2011-2022 走看看