CArrayObj

CArrayObj 类是存储 CObject 及其继承类的实例指针的变量动态数组。

描述

类 CArrayObj 可供操作 CObject 及其继承类的实例指针的变量动态数组。它为操纵那些原初数据类型和较难组织的数据结构的多维动态数组提供了可能。

类中实现了在数组里添加 / 插入 / 删除元素的能力, 数组排序, 在排序的数组里搜索。. 此外, 还实现了文件操作方法。

还有某些 CArrayObj 的 细微之处

声明

   class CArrayObj : public CArray

标称库文件

   #include <Arrays\ArrayObj.mqh>

继承体系

  CObject

      CArray

          CArrayObj

直接分支

CIndicators, CSeries

类方法

属性

 

FreeMode

获取内存管理标志

FreeMode

设置内存管理标志

内存控制

 

Reserve

分配内存增加数组大小

调整大小

设置数组新大小 (更小)

Shutdown

清除数组并完全释放内存数组 (非元素)。

添加方法

 

添加

在数组末尾添加元素

AddArray

在数组末尾添加元素

Insert

在数组中按指定位置插入元素

InsertArray

在数组中按指定位置插入另一个数组的元素

AssignArray

从另一个数组里拷贝元素至本数组

更新方法

 

Update

在指定数组位置修改元素

平移

在数组里从给定位置移动一个元素至另一个指定偏移。

删除方法

 

Detach

从数组指定位置获取元素, 并将其删除。

删除

从数组的指定位置删除元素

DeleteRange

从数组的指定位置删除一组元素

Clear

删除数组内所有元素而无需释放内存数组

访问方法

 

At

获取数组指定位置的元素

比较方法

 

CompareArray

比较数组与另一个数组

数组排序操作

 

InsertSort

在排序数组里插入元素

搜索

在排序数组里搜索与模型相等的元素

SearchGreat

在排序数组里搜索更多与样本相等的元素

SearchLess

在排序数组里搜索小于样本的元素

SearchGreatOrEqual

在排序数组里搜索大于或等于模型的元素

SearchLessOrEqual

在排序数组里搜索小于或等于模型的元素

SearchFirst

在排序数组里搜索首个与模型相等的元素

SearchLast

在排序数组里搜索最后一个与模型相等的元素

输入/输出

 

Save

保存数组数据至文件

Load

从文件里加载数组数据。

Type

获取数组类型标识符

方法继承自类 CObject

Prev, Prev, Next, Next, Compare

方法继承自类 CArray

Step, Step, Total, Available, Max, IsSorted, SortMode, Clear, Sort

数组的实际应用是 CObject 类的子类 (包括标准库里的所有类)。

例如, 考虑二维数组作为选项:

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayObj.mqh>
//---
void OnStart()
  {
   int i,j;
   int first_size=10;
   int second_size=100;
//--- 创建数组
   CArrayObj    *array=new CArrayObj;
   CArrayDouble *sub_array;
//---
   if(array==NULL)
     {
      printf("对象创建错误");
      return;
     }
//--- 创建子数组
   for(i=0;i<first_size;i++)
     {
      sub_array=new CArrayDouble;
      if(sub_array==NULL)
        {
         delete array;
         printf("对象创建错误");
         return;
        }
      //--- 填充数组
      for(j=0;j<second_size;j++)
        {
         sub_array.Add(i*j);
        }
      array.Add(sub_array);
     }
//--- 创建数组成功
   for(i=0;i<first_size;i++)
     {
      sub_array=array.At(i);
      for(j=0;j<second_size;j++)
        {
         double element=sub_array.At(j);
         //--- 使用数组元素
        }
     }
   delete array;
  }

细节 #

这个类具有控制动态内存机制,所以操作数组中的元素时要小心。

内存管理机制可以使用方法 FreeMode (bool) 切换。省缺时, 机制启用。

因此, 有两种选择来处理类 CArrayObj:

1. 内存管理机制启用。(省缺)

此种情况, 当元素从数组删除后 CArrayObj 负责释放其占用内存。在此程序里, 用户不应释放数组元素。

例如:

   int i;
//--- 创建数组
   CArrayObj *array=new CArrayObj;
//--- 填充数组元素
   for(i=0;i<10;i++) array.Add(new CObject);
//--- 做点什么
   for(i=0;i<array.Total();i++)
     {
      CObject *object=array.At(i);
      //--- 利用元素的动作
      . . .
     }
//--- 删除数组元素
   delete array;

2. 内存管理机制关闭。

此种情况, 当元素从数组删除后 CArrayObj 不负责释放其占用内存。在此程序里, 用户必须释放数组元素。

例如:

   int i;
//--- 创建数组
   CArrayObj *array=new CArrayObj;
//--- 禁用内存管理机制
   array.FreeMode(false);
//--- 填充数组元素
   for(i=0;i<10;i++) array.Add(new CObject);
//--- 做点什么
   for(i=0;i<array.Total();i++)
     {
      CObject *object=array.At(i);
      //--- 利用元素的动作
      . . .
     }
//--- 删除数组元素
   while(array.Total()) delete array.Detach();
//--- 删除空数组
   delete array;