浅析多维数组的下标重载

今天看到有人问,在2维或者多维数组的情况下怎样重载像[][]这样的操作符号。

其实思路也不难啊,只不过是重载2个[]符号而已,并且2个[]的功能各不一样。

第一个[]应该定位行.

最后一个[]应该返回最终数据的引用。

贴一下实现基本功能的代码吧,像越界检测,及其他功能就没写了,只要体现了思路,其他的功能好加。


代码如下:

#include <iostream>
#include <string>

using namespace std;

template <class T> class arr;
template <class T> class arrBody
{
    private:
    friend class arr<T>;
    T* data;
    int row,col,current_row;
    arrBody(int r,int c,T d):row(r),col(c)
    {
        data=new T[r*c];
        current_row=-1;
        for(int k=0;k<r*c;k++)              //初始化数据,默认为0
            data[k]=d;
    }
    public:
        T&   operator[](int  j)            //重载第2个[]号
        {
            if(j>=0&&j<col)
                return data[current_row*col+j];
        }
        ~arrBody(){delete[]data;} }; template <class  T>  class arr  
{  
private:
    arrBody<T> tBody;  
public:  
    arrBody<T>  &operator[](int i)         //重载第一个[]号
    {
        if(i>=0&&i<tBody.row)
            tBody.current_row=i;
        return tBody;
    }
    arr(int  i,int  j,T d=0):tBody(i,j,d) {}  
};

void main()
{
    arr<int> a(10,20);
    arr<double> b(5,5);
    cout<<a[5][5]<<endl;
}

(0)

相关推荐

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

    最近在写游戏,就以地图类模版为例说明如何模拟多维数组吧! 复制代码 代码如下: 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)); // 下标操作符重载      

  • 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

  • php中遍历二维数组并以表格的形式输出的方法

    一.索引数组 <?php //使用array()语句结构将联系人列表中所有数据声明为一个二维数组,默认下标是顺序数字索引 $contact1 = array( //定义外层数组 array(1,'高某','A公司','北京市','(010)987654321','gm@Linux.com'),//子数组1 array(2,'洛某','B公司','上海市','(021)123456789','lm@apache.com'),//子数组2 array(3,'峰某','C公司','天津市','(022

  • js 定义对象数组(结合)多维数组方法

    在php中定义数组很简单,但是在js中如果搞成字符为下标会出错,所以结合对象来搞 var top_ = { 'index':'首页', 'user':'用户', 'tree':'模块树' } ; var all_list = [ { "index": [ {'name':'网站栏目管理','url':'1.html'}, {'name':'网站栏目管理2','url':'2.html'} ] }, { "user": [ {'name':'用户管理','url':'

  • java定义二维数组的几种写法(小结)

    如下所示: //定义二维数组写法1 class numthree { public static void main(String[] args) { float[][] numthree; //定义一个float类型的2维数组 numthree=new float[5][5]; //为它分配5行5列的空间大小 numthree[0][0]=1.1f; //通过下标索引去访问 1行1列=1.1 numthree[1][0]=1.2f; // 2行1列=1.2 numthree[2][0]=1.3

  • Thinkphp将二维数组变为标签适用的一维数组方法总结

    本文实例总结了Thinkphp将二维数组变为标签适用的一维数组方法.分享给大家供大家参考.具体实现方法如下: 方法一: 复制代码 代码如下: $projectList=arr1tag($projectList,array('','请选择'),'project_name');    //其中$list为传值过来的二维数组,$default为默认值,$k为指定的表字段  function arr1tag($list,$default='',$k=''){   $tmp='';   if(array(

  • 3个PHP多维数组转为一维数组的方法实例

    很多时候我们需要将多维数组转成一维数组,因为我们只需要一维数组,而且一维数组使用起来更方便,在PHP中如何将多维数组转成一维数组?下面我们来看看三个多维数组转为一维数组例子:一.使用foreach 复制代码 代码如下: <?php   function arr_foreach ($arr)    {      static $tmp=array();        if (!is_array ($arr))       {         return false;      }      fo

  • C#使用二维数组模拟斗地主

    本文实例讲述了C#使用二维数组模拟斗地主的方法.分享给大家供大家参考.具体如下: package com.pb.demo; import java.util.Arrays; import java.util.Random; /** * 扑克牌随机发牌♠♥♣♦ 二维数组实现 * */ public class Puker { public static void main(String[] args) { // 定义数组 String[][] puker = new String[5][]; pu

  • 详解C++中的一维数组和二维数组

    C++一维数组 定义一维数组 定义一维数组的一般格式为:     类型标识符  数组名[常量表达式]; 例如: int a[10]; 它表示数组名为a,此数组为整型,有10个元素. 关于一维数组的几点说明: 1) 数组名定名规则和变量名相同,遵循标识符定名规则. 2) 用方括号括起来的常量表达式表示下标值,如下面的写法是合法的: int a[10]; int a[2*5]; int a[n*2]; //假设前面已定义了n为常变量 3) 常量表达式的值表示元素的个数,即数组长度.例如,在"int

  • 图文详解c/c++中的多级指针与多维数组

    前言 首先先声明一些常识,如果你对这些常识还不理解,请先去弥补一下基础知识: 1.实际上并不存在多维数组,所谓的多维数组本质上是用一维数组模拟的. 2.数组名是一个常量(意味着不允许对其进行赋值操作),其代表数组首元素的首地址. 3.数组与指针的关系是因为数组下标操作符[],比如,int a[3][2]相当于*(*(a+3)+2) . 4.指针是一种变量,也具有类型,其占用内存空间大小和系统有关,一般32位系统下,sizeof(指针变量)=4. 5.指针可以进行加减算术运算,加减的基本单位是si

随机推荐