C++ c++;返回对矩阵单行的引用

C++ c++;返回对矩阵单行的引用,c++,matrix,vector,C++,Matrix,Vector,所以我有一个名为Vector的结构,使用一个模板,如果需要的话,允许它有不同的长度。它包含一个数组来存储向量的元素 template <class T = float, int N = 3> struct Vector { T data[N]; 模板 结构向量 { T数据[N]; 另一种称为矩阵,本质上是数据数组中有N*N个元素的向量 template <class T = float, int N = 3> struct Matrix : public Ve

所以我有一个名为Vector的结构,使用一个模板,如果需要的话,允许它有不同的长度。它包含一个数组来存储向量的元素

template <class T = float, int N = 3>
struct Vector
{
    T data[N];
模板
结构向量
{
T数据[N];
另一种称为矩阵,本质上是数据数组中有N*N个元素的向量

template <class T = float, int N = 3>
struct Matrix : public Vector <T, N*N>
{
    Matrix() {}
模板
结构矩阵:公共向量
{
矩阵(){}
在矩阵的一个函数中,我需要返回它的一个“行”作为向量,以便对该向量所做的任何更改也会在矩阵的行中更改

inline Vector<T, N>& operator[](int row)
{
}
内联向量和运算符[](int行)
{
}

我不知道怎么做。

第I行的数据从
数据[I*N]
开始

template <class T = float, int N = 3>
struct Matrix : public Vector <T, N*N>
{
    Matrix() {}
    T* operator[](int i)
    {
       return &data[i*N];
    }
};
模板
结构矩阵:公共向量
{
矩阵(){}
T*运算符[](int i)
{
返回和数据[i*N];
}
};
用法:

Matrix<int, 10> m;
m[5][5] = 10;
矩阵m;
m[5][5]=10;

第i行的数据从
数据[i*N]
开始

template <class T = float, int N = 3>
struct Matrix : public Vector <T, N*N>
{
    Matrix() {}
    T* operator[](int i)
    {
       return &data[i*N];
    }
};
模板
结构矩阵:公共向量
{
矩阵(){}
T*运算符[](int i)
{
返回和数据[i*N];
}
};
用法:

Matrix<int, 10> m;
m[5][5] = 10;
矩阵m;
m[5][5]=10;

在我看来,您应该将
矩阵
类更改为“向量向量”,而不是单个线性向量:

struct Matrix : public Vector <Vector<T, N> , N>
结构矩阵:公共向量

现在,假设对
向量
正确实现了
运算符[]
,您就可以免费获得所需的行为。在我看来,您应该将
矩阵
类更改为“向量向量向量”,而不是单个线性向量:

struct Matrix : public Vector <Vector<T, N> , N>
结构矩阵:公共向量

现在,假设代码正确执行<代码>运算符[] /<代码> > <代码>向量< /> >

如果要查找的是能够处理单个元素的话,也可以考虑重载函数调用运算符。

template <class T = float, int N = 3>
struct Matrix : public Vector <T, N*N>
{
    Matrix() {}
    T& operator()(int row, int col)
    {
       return /*element*/;
    }
};

如果要查找的是能够处理单个元素,那么也可以考虑重载函数调用运算符。

template <class T = float, int N = 3>
struct Matrix : public Vector <T, N*N>
{
    Matrix() {}
    T& operator()(int row, int col)
    {
       return /*element*/;
    }
};

答案是

return *(Vector<T, N>*)(data+N*row);
返回*(向量*)(数据+N*行);

我不完全理解这个过程,我认为解释是,
data+N*row
给出一个指向数组中要开始的元素的指针,然后将该指针转换为向量类型指针,然后取消引用,以便可以发送到其他地方使用。也许更合适的人可以在注释中解释。

答案结束存在

return *(Vector<T, N>*)(data+N*row);
返回*(向量*)(数据+N*行);

我不完全理解这个过程,我认为解释是
data+N*row
给出一个指向数组中要开始的元素的指针,然后将该指针强制转换为向量类型指针,然后取消引用,这样它就可以发送到其他地方使用。也许更合适的人可以在注释中解释。

您可以返回一个p指向该行中的第一个元素的指针-
T
,但这对您的口味来说可能有点太“原始”。您可以使用一个
Matrix::row
类,该类包含对
Matrix
对象的引用,并具有一个
操作符[]
那索引到了那一行。@cdhowie我还应该提到返回类型必须是Vector&。这是为了做作业,但我似乎一点都不记得怎么做。
struct-Matrix:public-Vector
是必需的还是允许您更改它?@code-peedient它是必需的啊……您的问题没有提到您有一个转换构造函数。也许
返回向量(&data[N*row])
会更清楚。您可以返回指向该行中第一个元素的-
T
指针,但这可能有点太“原始”您可以使用一个
Matrix::Row
类,该类包含对
Matrix
对象的引用,并具有一个
操作符[]
那索引到了那一行。@cdhowie我还应该提到返回类型必须是Vector&。这是为了做作业,但我似乎一点都不记得怎么做。
struct-Matrix:public-Vector
是必需的还是允许您更改它?@code-peedient它是必需的啊……您的问题没有提到您有一个转换构造函数。可能
返回向量(&data[N*行])
会更清楚。Bummer这不是OP的选项,因为它看起来很自然。你可以使用C++11中的
模板别名使用
,顺便说一句。Bummer这不是OP的选项,因为它看起来很自然。你可以使用C++11中的
模板别名使用
,顺便说一句。
数据[I*N]
将是一个引用,
&data[I*N]
将是一个指针,指向第
I
-行数据的开头。
data[I*N]
将是一个引用,
&data[I*N]
将是一个指针,指向第
I
-行数据的开头。