单维数组的重载运算符 []

本文关键字:运算符 重载 数组 单维 | 更新日期: 2023-09-27 18:00:52

为了解决我已经在这里问过的问题 更改/访问矩阵元素的最佳/最快方法

我正在使用单维数组来存储矩阵。但是访问矩阵的元素成为一项繁琐的任务。

我目前将我的矩阵存储在这样的数组中

type[numberOfRows * numberOfColumns] myArray;

要访问[n][m]元素,我必须输入这个

blargh = myArray[(n*numberOfRows)+m];

。我想知道是否有可能重载/创建新的运算符[][]myArray[n][m]"翻译"为 myArray[(n*numberOfRows)+m].如果这是可能的,那会不会对性能造成太大阻碍。

编辑:事实证明,"强制内联"方法可以提高性能。

    [MethodImpl(MethodImplOptions.AggressiveInlining)]public void set(int x, int y, T value)
    {
        array[(x * wid) + y] = value;
    }
    [MethodImpl(MethodImplOptions.AggressiveInlining)]public T get(int x, int y)
    {
        return array[(x*wid) + y];
    }

单维数组的重载运算符 []

不能重

载数组类型的运算符,也不能更改其定义;这只能从该类型的定义中完成,您无法控制。

您可以做的是创建自己的类型来包装数组,并重载所需的运算符:

public class Matrix<T>
{
    private T[] array;
    public T this[int row, int column]
    {
        get { return array[row + column]; }
    }
}

性能差异(应该很小,但不是没有(是否是程序的问题,您需要分析和测量。

实现双重索引的一种方法(即 matrix[r][c]语法(将使用代理模式(也称为代理模式(。

这个想法是重载顶级operator[]以返回一个"记住"第一个索引和数组的特殊对象,并提供自己的重载operator[],该重载将"记住的"第一级索引与提供的二级索引相结合,以将实际的"平面"索引生成到数据数组中。

就程序逻辑而言,代理对象表示矩阵的列。以下是实现此目的的方法:

public class Matrix<T> {
    private readonly T[] data;
    private readonly int rowCount;
    public class Column {
        private readonly Matrix<T> m;
        private readonly int r;
        internal Column(Matrix<T> m, int r) {
            this.m = m;
            this.r = r;
        }
        public T this[int c] {
            get {
                return m.data[m.rowCount*r + c];
            }
        }
    }
    public Column this[int r] {
        get {
            return new Column(this, r);
        }
    }
}

此方法的性能影响是,每次访问顶级矩阵时都会创建一个对象。