下标操作符重载模拟多维数组详解

最近在写游戏,就以地图类模版为例说明如何模拟多维数组吧!


代码如下:

template <typename T_CELL_STYLE>
    class CMap
    {
    public:
        CMap(IN UINT row_num, IN UINT col_num,
                  IN T_CELL_STYLE cell_style = static_cast<T_CELL_STYLE>(0));

// 下标操作符重载
        typename vector<T_CELL_STYLE>::iterator operator[](IN UINT x);

public:
        const UINT m_ROW_NUM;    // 地图网格行数
        const UINT m_COL_NUM;    // 地图网格列数
    private:
        vector<T_CELL_STYLE> _m_map_data;    // 存放地图数据

}; /* class CMap */

我们知道下标操作符重载不能编写成如下形式:
T_CELL_STYLE operator[][](IN UINT x, IN UINT y);

虽然不能直接实现一对下标操作符重载,但是我们可以间接模拟。

思路是这样的,先通过单下标操作返回一个具有下标操作能力的左值,对左值进行下标操作,两个下标操作表达式联立就实现了双下标操作。先看如下示例:


代码如下:

// 地图尺寸
    #define _MAP_ROW   30
    #define _MAP_COL    36
    // 地图单元格样式
    typedef enum {
        _CELL_GROUND,
        _CELL_GRASS,
        _CELL_BRICK,
        _CELL_STEEL,
        _CELL_WATER
    } CELLSTYLE;

CMap<CELLSTYLE> myMap(_MAP_ROW, _MAP_COL, _CELL_GROUND);
    // 获取地图第3行第5列单元格样式
    vector<T_CELL_STYLE>::iterator iter = myMap[3];
    CELLSTYLE aCell = iter[5];

我们将上面两个下标操作表达式联立,如下:
CELLSTYLE aCell myMap[3][5];

这样就得到了双下标操作,看起来就像操作二维数组。好了,让我们来看一下如何重载。


代码如下:

template <typename T_CELL_STYLE>
    inline typename vector<T_CELL_STYLE>::iterator
    CMap<T_CELL_STYLE>::operator[](IN UINT x)
    {
        if (m_ROW_NUM <= x)
        {
            overflow_error e("overflow - CMap<T_CELL_STYLE>::operator[]");
            throw(e);
        }
        return _m_map_data.begin() + x * m_COL_NUM;
    }

看到了吧,是不是很简单,中间过程借用了一个具有下标操作能力的类类型成员。

(0)

相关推荐

  • C#多维数组学习使用

    复制代码 代码如下: String[, ,] items = new String[,,] { { { "A1", "A2", "A3", "☆", "○" }, { "B1", "B2", "B3", "☆", "○" }, { "C1", "C2", "C

  • 浅析多维数组的下标重载

    今天看到有人问,在2维或者多维数组的情况下怎样重载像[][]这样的操作符号. 其实思路也不难啊,只不过是重载2个[]符号而已,并且2个[]的功能各不一样. 第一个[]应该定位行. 最后一个[]应该返回最终数据的引用. 贴一下实现基本功能的代码吧,像越界检测,及其他功能就没写了,只要体现了思路,其他的功能好加. 复制代码 代码如下: #include <iostream> #include <string> using namespace std; template <clas

  • 下标操作符重载模拟多维数组详解

    最近在写游戏,就以地图类模版为例说明如何模拟多维数组吧! 复制代码 代码如下: template <typename T_CELL_STYLE>    class CMap    {    public:        CMap(IN UINT row_num, IN UINT col_num,                   IN T_CELL_STYLE cell_style = static_cast<T_CELL_STYLE>(0)); // 下标操作符重载      

  • Java基础语法之二维数组详解

    一.二维数组 进入正题之前.首先为了便于大家理解,我画了一个图: xx枪战游戏中, 我是一个刚刚注册账号的小白,系统送了我两把枪,此时,我的武器库只有这么一层(可以理解为一位数组,枪就是对应的数组中对应的元素) 经过艰苦卓绝的战斗,终于有了一笔钱,现在我打算配置好的游戏装备,我现在有了一个枪柜,它可以存放三层的枪械,每一层都可以放多把武器(这个就是二维数组,有多层,每层都是一个一维数组) 随着游戏时长和我的高超技术,获取游戏装备的效率越来越高了,一个枪柜已经存不下了,于是,我就有了多个枪柜(这个

  • IOS开发基础之二维数组详解

    IOS开发基础之二维数组详解 首先我们知道OC中是没有二维数组的,二维数组是通过一位数组的嵌套实现的,但是别忘了我们有字面量,实际上可以和C/C++类似的简洁地创建和使用二维数组.这里总结了创建二维数组的两种方法以及数组的访问方式. 通过字面量创建和使用二维数组(推荐) // 1.字面量创建二维数组并访问(推荐) NSArray *array2d = @[ @[@11,@12,@13], @[@21,@22,@23], @[@31,@32,@33] ]; // 字面量访问方式(推荐) NSLog

  • Java多维数组详解

    目录 0.前言及思维导图 0.1 怎么理解多维数组? 0.2 思维导图: 1.多维数组的动态初始化 1.1 语法格式 1.2 以例助解 2.多维数组的引用 2.1引用方式 3.补充:获取数组长度 总结 0.前言及思维导图 0.1 怎么理解多维数组? 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组. 0.2 思维导图: 1.多维数组的动态初始化 ★以二维数组为例 1.1 语法格式 直接为每一维分配空间,格式如下: type[][] typeName

  • C语言 指针与二维数组详解

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 0   1   2   3 4   5   6   7 8   9  10  11 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放 a[

  • Java开发必备知识之数组详解

    一.ASCII码 二.为什么需要数组 案例: 160班 现在 77人 统计 全班的Java成绩 用程序进行存储 变量 统计 全班不及格的同学 要 补考 补考过的同学 修改成绩 定义 77 个变量 int 帅 = 59: int 洋 = 100: int cto = 60: int ceo = 58: 三.什么是数组 概念:数组就是内存中一块 连续的 内存空间,用于存放 相同类型 的多个数据 四.定义数组 声明一个数组:确定数组中存放的数据类型 语法: 数据类型[] 数组名://建议 数据类型 [

  • 基于php数组中的索引数组和关联数组详解

    php中的索引数组是指以数字为键的数组.并且这个键值 是自增的 关联数组指的是一个键值对应一个值,并且这个键值是不规律的,通常都是我们自己指定的. 他们两还有不同的地方,索引数组转为json后是数组.而关联数组转为json后是对象.通常我们给app端写接口都是用索引数组转成json传过去.客户端那边对数组更为友好一点. 需要注意点: $arr = [0=>1,2=>3a]; 上述数组$arr转为json会是对象形式的. $arr = ['a','b']; 这里的$arr转为json后是数组的形

  • Numpy掩码式数组详解

    数据很大形况下是凌乱的,并且含有空白的或者无法处理的字符,掩码式数组可以很好的忽略残缺的或者是无效的数据点.掩码式数组由一个正常数组与一个布尔式数组组成,若布尔数组中为Ture,则表示正常数组中对应下标的值无效,反之False表示对应正常数组的值有效. 创建方法为,首先创建一个布尔型数组,然后通过numpy.ma子程序包提供的函数来创建掩码式数组,掩码式数组提供了各种所需函数. 创建实例如下: import numpy as np origin = np.arange(16).reshape(4

  • Java基础之数组详解

    前言 我们了解数组这个概念之前,我们先思考下面几个问题. 如果我们需要两个数据,那么直接创建两个变量即可 int a; int b; 如果需要五个数据,那么可以创建五个变量 int a; int b; int c; int d; int f; 但如果我们需要100个甚至是1万个数据,那么我们创一万个变量?显然这是不现实的.这个时候就需要我们的数组来起作用!帮我们"批量"创建变量. 由上可以得出:数组的本质就是让我们能"批量"创建相同类型的变量! 一.数组的概念 数组

  • C语言 模拟实现strlen函数详解

    目录 前言 一.strlen函数的介绍 1.strlen函数的声明 2.strlen函数的简单运用 3.注意事项 二.三种实现strlen函数的方法 1.计数器的方法 2.递归方法 3.指针-指针的方法 前言 用C语言模拟实现strlen函数,我这里有三种方法,快来看看跟你用的方法是否是一样. 一.strlen函数的介绍 1.strlen函数的声明 size_t strlen ( const char * str ): 这里函数的返回值为无符号整形(size_t),传入的是一个常量char*类型

随机推荐