我在C ++中编写一个稀疏矩阵类,其中每一行和每列都是来自我创建的类的链接列表数组(恰当地命名为:LinkedList)。
我想编写一个类,它是指向此矩阵中一个单元格的“智能”指针。
在该课程中,我要说LIPointer
,我将实现一个++
运算符函数,用于移动矩阵的链接列表。
每次创建linkedlistPointer
时,是否有一种优雅的方法可以不移动矩阵数组和大小元素的引用?
我不能使用stl::array
等因为我必须自己构建它们。
以下是声明:
class LinkedItem
{
private:
int Column, Row;
double Value;
LinkedItem* Right;
LinkedItem* Down;
public:
...
};
class SparseLinkedMatrix
{
private: //members
int ColSize;
int RowSize;
LinkedItem ** Columns;
LinkedItem ** Rows;
public: //functions
SparseLinkedMatrix();
...
};
class LIPointer;
private:
LinkedItem * CellPointer;
public:
LIPointer();
void operator++();//???
...
};
任何建议或指示都将不胜感激。
更新:它需要在整个矩阵上运行。这就是为什么我认为我需要移动(通过引用)数组和矩阵的大小。预期的效果是,这将从第一行的链表中的最后一个单元格到第二行的第一个单元格。
答案 0 :(得分:1)
对于压缩行矩阵,我使用类似:
std::vector<std::map<size_t, double> > matrix;
然后我可以使用:
添加一个条目matrix[row][col] += val;
对于每一行,我可以按升序迭代列条目并读出值。
编辑:提出问题的人确实指出他们不能使用STL。也许他们可以使用某种地图而不是链表。否则,我建议使用链接列表的向量,并继续在每个列表的末尾添加条目。然后在添加条目时完成每种链表的排序。
答案 1 :(得分:1)
请您详细说明您希望operator ++()做什么?
例如,让LIPointer的operator ++()进入下一个右边元素:
void operator++()
{
if ( CellPointer != NULL )
CellPointer = CellPointer->Right;
}
但是当它到达终点时它会停止。