如何访问valarray的子​​序列,将其视为C++中的2D矩阵

Sam*_*Sam 6 c++

我正在学习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::slicevalarray,所以,如果我改变的值,它也是在矩阵变化?

我在valarray中读过这个定义:

std::slice_array<T> operator[]( std::slice slicearr );
Run Code Online (Sandbox Code Playgroud)

operator[]必须有std::slice_array<double>&返回类型?

谢谢.

lub*_*bgr 3

我不认为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)

请注意, 和MatrixRowProxy缺少重载和正确的const-ness 处理,并且变量名称很差。另外,您可能需要考虑越界错误处理策略。但它可以作为您实施的起点。