C++ c++;返回对矩阵单行的引用
所以我有一个名为Vector的结构,使用一个模板,如果需要的话,允许它有不同的长度。它包含一个数组来存储向量的元素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
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
-行数据的开头。