单维数组的重载运算符 []
本文关键字:运算符 重载 数组 单维 | 更新日期: 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);
}
}
}
此方法的性能影响是,每次访问顶级矩阵时都会创建一个对象。