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

 更新时间:2020年4月25日 17:44  点击:2203

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

复制代码 代码如下:

    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;
    }

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

[!--infotagslink--]

相关文章

  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • Lua一维数组与多维数组的使用示例

    今天小编就为大家分享一篇关于Lua一维数组与多维数组的使用示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-06-30
  • php多维数组的排序方式

    php多维数组的排序方式与单数组会有一些不同了同时在不同版本中也有不同的函数了,下面小编整理了一自己在使用php中整理的一些关于php多维数组的排序例子,希望这些例子...2016-11-25
  • 下标操作符重载模拟多维数组详解

    虽然不能直接实现一对下标操作符重载,但是我们可以间接模拟。思路是这样的,先通过单下标操作返回一个具有下标操作能力的左值,对左值进行下标操作,两个下标操作表达式联立就实现了双下标操作...2020-04-25
  • PHP多维数组元素操作类的方法

    下面小编就为大家带来一一篇PHP多维数组元素操作类的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-11-22
  • 图文详解c/c++中的多级指针与多维数组

    多维数组与多级指针是初学者经常感觉迷糊的一个地方。超过二维的数组和超过二级的指针其实并不多用。但只要掌握一定的方法,理解多级指针和“多维”数组完全可以像理解一级指针和一维数组那样简单。...2020-04-25
  • php获得二维或多维数组长度

    在php教程中,获得二维或多维数组的第一维的长度,这是个常用的程序判断,比如你读取的数组是一个二维数组: <?php $arr=array( 0=>array('title' => '新...2016-11-25
  • PHP多维数组遍历方法(2种实现方法)

    这篇文章主要介绍了PHP多维数组遍历方法,实例分析了2种多维数组的遍历技巧,包括简单的foreach遍历与递归操作遍历实现方法,需要的朋友可以参考下...2015-12-14
  • php 多维数组排序 array_multisort函数用法

    array_multisort函数是php自带对二维数据进行排序的函数,下面我们一起来看看多维数组排序 array_multisort函数用法,希望文章能够帮助到各位。 对2维数组或者多维...2016-11-25
  • PHP递归删除多维数组中的某个值

    这篇文章主要介绍了PHP递归删除多维数组中的某个值,需要的朋友可以参考下...2017-04-26
  • php对多维数组的某个键值排序方法

    确定了很多多维数组排序的函数与例子,但一直对于指定键值进行排序处理不好,今天就网上网罗了一大堆方法,下面整理一下防止以后使用,同时也希望对各位朋友会有所帮助。...2016-11-25
  • php中搜索多维数组的键值程序

    例如搜索“ok”就会匹配ok里面的数组 “你好,good,很好\"打印出来如果搜索“好”没有匹配到第一数组,就会模糊搜索所有含有“好”的的关键词,例如“你好 很好 爱好”...2016-11-25
  • php多维数组排序方法

    本文章详细的介绍了关于多维数组排序的方法,array_multisort()这个函数可以对多个PHP数组进行排序,排序结果是所有的数组都按第一个数组的顺序进行排列——有点拗口,真的...2016-11-25
  • php 遍历二维数组与多维数组代码

    关于php的数组,我们来讲一下,二维数组与多维的遍历代码,下面举了三个实例来测试数组的遍历php代码函数了。 代码如下 复制代码 function arr_fo...2016-11-25
  • C#多维数组学习使用

    当下, 由于存储结构需要, 用多维数组, 顺便学习了一下, 将学习经过备忘如下...2020-06-25
  • 浅析多维数组的下标重载

    贴一下实现基本功能的代码吧,像越界检测,及其他功能就没写了,只要体现了思路,其他的功能好加...2020-04-25
  • php数组搜索(多维数组搜索)

    在php中要实现数组搜索方法有很多种,我知道最简单的就是in_array与遍历数组后再一个个对比,其它还有更多更好方法,下面我来介绍介绍。 一维数组搜索很简单in_array...2016-11-25
  • php中count 多维数组长度统计实现方法

    php中count 多维数组长度统计实现方法 有需要的朋友可参考一下下。 下面程序运行结果为() 代码如下 复制代码 ?$numb=array( a...2016-11-25
  • PHP递归遍历多维数组实现无限分类的方法

    这篇文章主要介绍了PHP递归遍历多维数组实现无限分类的方法,涉及PHP递归操作遍历数组的相关技巧,在联动菜单及父子栏目设计等方面非常具有实用价值,需要的朋友可以参考下...2016-05-10
  • PHP求异形多维数组的平均值的例子

    PHP求异形多维数组的平均值的方法小编能想到的就是遍历数组了,那么还有其它的办法可以实现吗,下面我们一起来看看。 在php中,求一个多维异形多维数组常见的方法就是...2016-11-25