我正在学习C++,所以请耐心等待我.我有一个std::valarray在其中有double元素,我认为这是一个二维矩阵.
class Matrix {
valarray<double> elems;
int r, c;
public:
/* type? operator[](int r) { return ? } */
//...
}
Run Code Online (Sandbox Code Playgroud)
我想重载operator[],以便我可以得到一行矩阵,然后,我想要m[r][c]访问运算符.
有没有什么办法让一排,为的序列double使用std::slice的valarray,所以,如果我改变的值,它也是在矩阵变化?
我在valarray中读过这个定义:
std::slice_array<T> operator[]( std::slice slicearr );
Run Code Online (Sandbox Code Playgroud)
我operator[]必须有std::slice_array<double>&返回类型?
谢谢.
我不认为std::sliceandstd::slice_array是您正在寻找的,尤其是后者只不过是具有非常有限的公共接口的辅助类型。您可以返回一个代理对象。这是如何实现它的一个可能的示例。
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);
}
};
Run Code Online (Sandbox Code Playgroud)
这样,您就可以使用两个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;
Run Code Online (Sandbox Code Playgroud)
请注意, 和Matrix都RowProxy缺少重载和正确的const-ness 处理,并且变量名称很差。另外,您可能需要考虑越界错误处理策略。但它可以作为您实施的起点。