重载二维数组下标"[][]"

问题来源:(待续)

解决办法:

(1) 可变长数组

对于可变的二维数组下标重载,在数组初始化时指定维数,之后可以像一般的二维数组进行赋值和取值操作. 当然,使用模板template来实现更好.

 1 class Array2d{
 2     private:
 3         int* a;
 4         int nrow;
 5         int ncol;
 6     public:
 7         Array2d(const int nrow_, const int ncol_)
 8         :nrow(nrow_), ncol(ncol_)
 9         {
10             a = new int[nrow * ncol];
11         }
12         Array2d(){}
13
14         ~Array2d(){
15             delete[] a;
16         }
17
18         int* operator[](const int idx) const {
19             return &a[idx * ncol];
20         }
21
22         int operator()(const int x, const int y){
23             return a[x * ncol + y];
24         }
25
26         Array2d& operator=(Array2d& aobj){
27             this->nrow = aobj.getNrow();
28             this->ncol = aobj.getNcol();
29             this->a = new int[nrow * ncol];
30             for(int i = 0; i < nrow; ++i ){
31                 for(int j = 0; j < ncol; ++j){
32                     this->a[i * ncol + j] = aobj[i][j];
33                 }
34             }
35         }
36         int getNrow(){ return nrow; }
37         int getNcol(){ return ncol; }
38         int* getA(){ return a; }
39 };

Array2d

测试代码为:

 1 int main() {
 2     Array2d a(3,4);
 3     int i,j;
 4     for(  i = 0;i < 3; ++i )
 5         for(  j = 0; j < 4; j ++ )
 6             a[i][j] = i * 4 + j;
 7     for(  i = 0;i < 3; ++i ) {
 8         for(  j = 0; j < 4; j ++ ) {
 9             cout << a(i,j) << ",";
10         }
11         cout << endl;
12     }
13     cout << "next" << endl;
14     Array2 b;     b = a;
15     for(  i = 0;i < 3; ++i ) {
16         for(  j = 0; j < 4; j ++ ) {
17             cout << b[i][j] << ",";
18         }
19         cout << endl;
20     }
21     return 0;
22 }

test_code

输出结果为:

0,1,2,3,
4,5,6,7,
8,9,10,11,
next
0,1,2,3,
4,5,6,7,
8,9,10,11,

result

(2)固定长数组

据悉,固定维数的二维数组下标重载,一般在像3D图形方面经常涉及到一些平移转换矩阵时用到,这里以 4 * 4 的矩阵为例

1 struct Matrix4f
2 {
3     float m[4][4];
4
5     float * const operator[](const int i)
6     {
7         return m[i];
8     }
9 };

Matrix4f

测试代码为:

1 int main(){
2     Matrix4f m;
3     m[0][0] = 1.0f;
4     m[1][1] = 9.9f;
5     cout << m[0][0] << endl;          // 1
6     cout << m[1][1] << endl;          // 9.9
7     return 0;
8 }

test_code

!十分感谢以下博客的作者:

http://www.2cto.com/kf/201403/285924.html

时间: 2024-10-13 17:15:14

重载二维数组下标"[][]"的相关文章

C语言二维数组作为函数的参数

前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include <cstdio> void print(int *a[3]) { printf("%d\n",a[0][0]); } int main() { int a[2][3] = {1,2,3,4,5,6}; print(a); return 0; } 编译程序时候,在第10行提示错误信息:|

C/C++二维数组

已知在C/C++中当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针. 1.二维数组的概念 在C语言中,二维数组实际上是一种特殊的一维数组,它的每个元素也是一个一维数组.因此,二维数组下标形式正确写法如下:int arrays[i][j]. 2.二维数组作为函数参数(传递数组时必须让编译器知道数组最后一维的大小,例如二维数组是列) 规定:如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数(否则编译器无法获得最小元素的地址,因为编译器不知道列的跨度是多少就无法精确

C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include <stdlib.h> int main() { int a1=20, a2=345, a3=700, a4=22; int b1=56720, b2=9999, b3=20098, b4=2; int c1=233, c2=205, c3=1, c4=6666; int d1=34, d2=0, d3

编程题:二维数组的下标意义

#include<stdio.h> void main() { int i,j,a[2][3],b[2][3]; for(i=0;i<2;i++) for(j=0;j<3;j++) a[i][j]=i; for(i=0;i<2;i++) for(j=0;j<3;j++) b[i][j]=j; printf("array a:\n"); for(i=0;i<2;i++) { for(j=0;j<3;j++) printf("%3d

PHP 统计一维数组value相同的元素的个数num,并将其转化为下标为数字,值是value和num的二维数组

最近做一个项目,从数据库查询某个字段得到一个数组key是数字值是channel的一维数组$res,现需要将这个数组变成键是数字值是channel和num(num为相同channel的数量,默认为0). $res数组 array (size=2) 0 => string '0' (length=1) 1 => string '500000009' (length=9) 2 => string '500000009' (length=9) $rs数组 array (size=2) 0 =&g

编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)

      首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题.这个问题无疑就是把原问题扩展到二维的情况.       想起来这个问题也不是很难,我们可以求解一维矩阵的思想,即我们可以固定住行(或列),之后,我们去求解列(或行)所构成的最大和就可以了. 这里的解法利用的是固定住行,然后求解需要寻找的列之和,利用书中提到的一个公式: 以左上角的元素(1,1)和当前元素(i,j)为顶点对的子矩阵的部分和,部分和的计算如下 PS[i][j] = A[i][j]+PS[

PHP 统计一维数组value同样的元素的个数num,并将其转化为下标为数字,值是value和num的二维数组

近期做一个项目.从数据库查询某个字段得到一个数组key是数字值是channel的一维数组$res,现须要将这个数组变成键是数字值是channel和num(num为同样channel的数量,默觉得0). $res数组 array (size=2) 0 => string '0' (length=1) 1 => string '500000009' (length=9) 2 => string '500000009' (length=9) $rs数组 array (size=2) 0 =&g

二维数组与指针

二维数组: int / char / flaot a[n][m]; 可以看做是将一维数组做为基本类型产生的一维数组的数组类型,共n*m个最基本类型.这样看有许多优点(实际上计算机也是这样分配的). 二维数组数组名的注意事项: 1 #include <stdio.h> 2 int main() 3 { 4 int *p,a[3][4]; 5 p = a;//a是二维数组的首地址本质为行指针,原型为 a[][]:无法赋值给普通指针类型 *p: 6 return 0; 7 } 编译就会出现如下错误

二维数组最大连通和的求解

求一个二维数组的连通的数组中和最大的最大值. 代码 #include<iostream> #include<string> using namespace std; void MaxIntArray(int a[],int &max,int &begin,int &end,int n); //先将二维数组按行分成n个一维数组,求出每个一维数组最大子数组和,并记录最大子数组和的首末位置,在通过首末位置判断是否联通 void main() { int n,m;/