我正在学习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::slicevalarray序列,以便如果我更改一个值,它也在矩阵中也更改了?

我已经在valarray中阅读了以下定义:
std::slice_array<T> operator[]( std::slice slicearr );

我的operator[]必须具有std::slice_array<double>&作为返回类型吗?

谢谢。

最佳答案

我认为std::slicestd::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;

请注意,MatrixRowProxy都缺少重载,并且对const -ness的处理正确,并且变量名很差。另外,您可能想考虑一个越界错误处理策略。但这可能是您实现的起点。

关于c++ - 如何在C++中将其视为2D矩阵来访问valarray的子​​序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53378000/

10-13 08:34