【发布时间】:2015-04-01 07:33:05
【问题描述】:
我的某个项目遇到了障碍。我想创建一个上三角矩阵(对角线以下的所有元素都为零),它只分配保存非零元素所需的内存。我遇到的问题是索引到这个矩阵。我宁愿不必重新设计矩阵,但如果这是唯一的解决方案,那么我可以接受。附带说明一下,Vector 是我自己的实现,而不是 stl Vector。
到目前为止,我的类声明如下:
template <class T>
class UMatrix : public AbstractMatrix<T>
{
private:
Vector<T>* m_data;
int m_size;
public:
//lots of member functions
};
上三角矩阵的构造函数:
template <class T>
UMatrix<T>(const int size)
{
m_size = size;
if(size < 1)
throw(RangeErr(size));
m_data = new Vector<T> [size];
for(int i = 0; i < size; i++)
{
Vector<T> init(i + 1);
m_data[i] = init;
}
}
还有我遇到问题的代码:
template <class T>
Vector<T>& operator[] (const int index)
{
if(m_data != NULL && index >= 0 && index < m_rows)
{
// Insert dark magic here
}
else
{
throw(RangeErr(index));
}
}
这会产生一个交错向量数组,每个向量的长度都比前一个大 1。
我正在尝试实现括号运算符,以便UMatrix[a][b] 访问真正的上三角矩阵的 a 行、b 列。这意味着UMatrix[a][b] == 0 当a > b。
括号运算符也是抽象基类的虚函数,必须返回一个Vector&。此外,此实现必须使用方括号运算符,而不是 function () 运算符,以便与以前编写的代码兼容。我知道使用密集矩阵会更简单,但我仅限于必要的内存使用。
我的第一次尝试涉及使用一个向量进行存储,类似于一维数组矩阵。但是,括号运算符似乎也不可能为该实现编写。
我的问题:是否有可能实现这个括号运算符?
【问题讨论】:
-
new Vector通常是错误的。为什么不只是有一个矢量对象?要制作 2d[]运算符,您必须使用代理对象。添加带有任意数量参数的operator()会更容易。
标签: c++ matrix operator-keyword square-bracket