我正在学习C++,所以请耐心等待我。
我有一个std::valarray
,其中包含double
元素,我将其视为2D矩阵。
class Matrix {
valarray<double> elems;
int r, c;
public:
/* type? operator[](int r) { return ? } */
//...
}
我想重载
operator[]
,以便获得矩阵的一行,然后,我想要m[r][c]
访问运算符。有什么方法可以获取一行,作为在
double
中使用std::slice
的valarray
序列,以便如果我更改一个值,它也在矩阵中也更改了?我已经在valarray中阅读了以下定义:
std::slice_array<T> operator[]( std::slice slicearr );
我的
operator[]
必须具有std::slice_array<double>&
作为返回类型吗?谢谢。
最佳答案
我认为std::slice
和std::slice_array
不是您要的内容,尤其是后者只是一种具有非常有限的公共(public)接口(interface)的帮助程序类型。您可以改为返回一个代理对象。这是一个如何实现的示例。
class Matrix {
/* ... */
class RowProxy {
public:
RowProxy(std::valarray<double>& elems, int c, int row) :
elems(elems), c(c), row(row) {}
double& operator[](int j)
{
return elems[row*c + j];
}
private:
std::valarray<double>& elems;
int row;
int c;
};
RowProxy operator[](int i)
{
return RowProxy(elems, c, i);
}
};
这样,您可以使用两个
operator[]
访问数据。Matrix m(2, 4); // Assuming the ctor initializes elemens with row*column
m[0][0] = 1.234;
m[1][0] = 2.234;
m[1][3] = -52.023;
请注意,
Matrix
和RowProxy
都缺少重载,并且对const
-ness的处理正确,并且变量名很差。另外,您可能想考虑一个越界错误处理策略。但这可能是您实现的起点。关于c++ - 如何在C++中将其视为2D矩阵来访问valarray的子序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53378000/