zoukankan      html  css  js  c++  java
  • c++动态二维数组的双下标运算符重载

    实现双下标的方式对元素进行赋值和读取的操作两种方法:

    方法一:创建两个类,一个是存储行的类Row,另一个就是二维数组矩阵类Matrix。

    方法二:创建一个类,类中动态生成二维数组,但此方法使得二维数组中的元素不连续。

    示例代码(数据类型以int型为例)

    方法一:

     1 #include <iostream>
     2 using namespace std;
     3 //--------------行类定义开始----------------------------------
     4 class Row
     5 {
     6 public:
     7     Row();
     8     ~Row();
     9     int& operator[](int aindex);//行下标运算符重载。
    10     static void setsize(int asize);//静态成员函数对row_size进行修改。
    11 private:
    12     int *base;
    13     static int row_size;//静态数据成员用于记录行元素的个数。
    14 };
    15 
    16 //静态数据成员默认值设为1.
    17 int Row::row_size=1;
    18 
    19 /*------------------------------------------------------------
    20 构造函数。
    21 ------------------------------------------------------------*/
    22 Row::Row()
    23 {
    24     base=new int[row_size];//申请行内存。
    25 }
    26 /*------------------------------------------------------------
    27 析构函数。
    28 ------------------------------------------------------------*/
    29 Row::~Row()
    30 {
    31     if (base)
    32     {
    33         delete []base;//释放内存。
    34     }
    35 }
    36 /*------------------------------------------------------------
    37 操作目的:设置静态变量值。
    38 函数参数:int型的变量。
    39 ------------------------------------------------------------*/
    40 void Row::setsize(int asize)
    41 {
    42     if (asize>0)
    43     {
    44         row_size=asize;
    45     }
    46 }
    47 /*------------------------------------------------------------
    48 操作目的:一维数组类的下标运算符重载
    49 函数参数:下标值 aindex
    50 返回值:数组元素的引用。
    51 ------------------------------------------------------------*/
    52 int& Row::operator [](int aindex)
    53 {
    54     //若下标值大于元素个数,则终止程序。
    55     if (aindex>=row_size)
    56     {
    57         exit(-1);
    58     }
    59     //返回该元素本身。
    60     return base[aindex];
    61 }
    62 //------------------行类定义结束,数组类定义开始-----------------------------------------
    63 
    64 class Matrix
    65 {
    66 public:
    67     Matrix(int arow=5,int acol=5);//默认创建5行5列的二维数组。
    68     ~Matrix();//析构函数。
    69     Row& operator[](int aindex);//二维数组的下标运算符重载。
    70 private:
    71     Row *base;//行类型的指针。
    72     int height;//记录行的高度。
    73 };
    74 Matrix::Matrix(int arow,int acol)
    75 {
    76     //将行数赋给height
    77     height=arow;
    78     //此处先设置Row类中的静态变量,再申请类型为Row的连续内存。
    79     Row::setsize(acol);
    80     base=new Row[height];
    81 }
    82 Matrix::~Matrix()
    83 {
    84     if (base)
    85     {
    86         delete []base;//此处释放Row类型的指针,会自动调用Row类的析构函数,进而释放行元素的内存空间。
    87     }
    88 }
    89 Row& Matrix::operator [](int aindex)
    90 {
    91     //若下标值大于元素个数,则终止程序.
    92     if (aindex>=height)
    93     {
    94         exit(-1);
    95     }
    96     /*返回一个Row类型的对象,
    97     用Row类的对象调用第二个下标值,再返回Row类中的元素。*/
    98     return base[aindex];
    99 }

    总结:

      第一种方法使得元素在内存中连续存储。回收内存时自动调用两个类的析构函数使得内存回收高效简洁。

    第二种方法在下次贴出。

  • 相关阅读:
    [Vue] Create Filters in Vue.js
    [Vue] Import component into page
    [Angular Form] ngModel and ngModelChange
    [Ramda] Convert a QueryString to an Object using Function Composition in Ramda
    [Vue] Use basic event handling in Vue
    [Ramda] Declaratively Map Data Transformations to Object Properties Using Ramda evolve
    Linux2.6内核--VFS层中和进程相关的数据结构
    [置顶] Firefox OS 学习——Gaia 编译分析
    ORACLE 索引概述
    【笔试&面试】C#的托管代码与非托管代码
  • 原文地址:https://www.cnblogs.com/csdnmc/p/2836554.html
Copyright © 2011-2022 走看看