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的成员类型,如果不是常见的可串行化的类型,则必须各自实现自己的串行化!

MFC模板CArray及其派生类的更多相关文章

  1. VS2010 MFC中 在FormView派生类里获取文档类指针的方法

    经过苦苦调试,今晚终于解决了一个大问题. 我想要实现的是:在一个FormView的派生类里获取到文档类的指针. 但是出现问题:试了很多办法,始终无法获取到. 终于,此问题在我不懈地调试加尝试下解决了. ...

  2. C++ - 派生类访问模板基类(templatized base class)命名

    派生类访问模板基类(templatized base class)命名 本文地址: http://blog.csdn.net/caroline_wendy/article/details/239936 ...

  3. objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令 的解决方式

    objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令  的解决方式 图文By edata ,转载注明出处 http://www.cnblogs.com/edata 1 ...

  4. C++ 虚函数在基类与派生类对象间的表现及其分析

    近来看了侯捷的<深入浅出MFC>,读到C++重要性质中的虚函数与多态那部分内容时,顿时有了疑惑.因为书中说了这么一句:使用“基类之指针”指向“派生类之对象”,由该指针只能调用基类所定义的函 ...

  5. 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

      您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...

  6. MVC ActionResult派生类关系图

    态度决定一切,我要改变的不仅仅是技术,还有对待事情的态度! 先上个图: 由上图可知,ActionResult为根节点,其下有很多子节点!下面简单介绍下: MVC中ActionResult是Action ...

  7. 我的QT5学习之路(三)——模板库、工具类和控件(下)

    一.前言 作为第三篇的最后一部分,我们来看一下Qt的控件,谈到控件,就会让人想到界面的美观性和易操作性,进而想到开发的便捷性.作为windows界面开发的MFC曾经是盛行了多少年,但是其弊端也随着其他 ...

  8. google test 打印派生类对象

    在Unison中使用google test时,发现EXPECT_EQ在fail时,不能打印Unison Test Language中定义的派生类的对象.于是写了个纯C++的示例,发现在只定义基类的op ...

  9. MFC/QT 学习笔记(三)——MFC模板创建

    新建项目->MFC模板->MFC应用程序->应用程序类型:单个文档:项目样式:MFC 标准->下一步...OK 此时点击运行,可直接弹出窗口. 调整 视图->类视图: · ...

随机推荐

  1. 【Web】CXF WebService 服务端和客户端 环境搭建及测试

    cxf服务端 1.去官方下载对应的jar包:http://cxf.apache.org/ 2.maven配置相应jar包 3.修改web.xml,完成spring和cxf配置 <!-- Spri ...

  2. enum型常量

    就像结构体一样,定义一个枚举类型是不分配内存的,仅仅是定义了一个类型的名字,下面可以使用这个名字定义枚举类型的变量 枚举即将变量的值一一列举出来变量的值只限于列举出来的值得范围内 简单的应用如下 #i ...

  3. Hibernate入门之配置文件

    <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...

  4. 我的Python成长之路---第三天---Python基础(12)---2016年1月16日(雾霾)

    四.函数 日常生活中,要完成一件复杂的功能,我们总是习惯把“大功能”分解为多个“小功能”以实现.在编程的世界里,“功能”可称呼为“函数”,因此“函数”其实就是一段实现了某种功能的代码,并且可以供其它代 ...

  5. POJ 1379 Run Away 【基础模拟退火】

    题意:找出一点,距离所有所有点的最短距离最大 二维平面内模拟退火即可,同样这题用最小圆覆盖也是可以的. Source Code: //#pragma comment(linker, "/ST ...

  6. django 新闻编辑笔记

    url(r'^news_manage/edit/$',views.news_edit,name='edit') url配置 <a href="/management/news_mana ...

  7. LGPL与闭源程序

    最近一直在学习 Qt.Qt 有两个许可证:LGPL 和商业协议.这两个协议在现在的 Qt 版本中的代码是完全一致的(潜在含义是,Qt 的早期版本,商业版的 Qt 通常包含有一些开源版本所没有的库,比如 ...

  8. Qt如何读取ico文件中的image(使用QImageReader和QIcon)

    ico文件是一个容器,内部可以装载许多个image,我们可以通过QIcon的pixmap方法来获取需要的image QPixmap pixmap ( const QSize & size, M ...

  9. ASP.NET MVC 5 学习教程:创建连接字符串

    原文 ASP.NET MVC 5 学习教程:创建连接字符串 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  10. oschina数据库相关

    数据库相关 110数据库服务器 233NoSQL数据库 18MySQL衍生版 6开源XML数据库 311数据库管理工具 117数据库调整和优化 274数据库驱动程序 41数据库建模