问题是:是否可以使用以下稀疏列表实现创建稀疏矩阵?特别是,使用带有类模板的类模板(SparseList *>)?
我已经创建了一个名为SparseList的类模板,我可以在任何索引中添加元素。
我想用它来创建一个SparseMatrix类模板。所以我尝试了以下......
//SparseMatrix.h
template <typename T>
class SparseMatrix {
public:
SparseMatrix();
private:
SparseList<SparseList<T>*> *matrix;
};
template <typename T>
SparseMatrix<T>::SparseMatrix() {
matrix = new SparseList<SparseList<T>*>();
}
但是当我尝试在main上实例化它时......
int main() {
SparseMatrix<int> *matrix;
matrix = new SparseMatrix<int>(); //without this line it compiled normally.
return 0;
}
我收到以下错误...
In file included from src/main.cpp:
SparseMatrix.h: instantiated from 'SparseMatrix<T>::SparseMatrix() [with T = int]'
main.cpp: instantiated from here
SparseList.h: error: template argument required for 'struct SparseMatrix'
我正在使用NetBeansIDE 6.9.1和MinGW。
编辑:
//SparseList.h
template <typename T>
class SparseList {
template <typename U>
friend std::ostream & operator<<(std::ostream &output, const SparseList<U> &list);
public:
SparseList();
virtual ~SparseList();
void insert(T &entry, int index);
T & get(int i);
int length();
private:
struct ListNode {
int index;
T *entry;
ListNode *next;
};
ListNode *head; //pointer to the first entry in the sparse list.
int size; //# of entries.
};
我已经在SparseList中测试了插入和获取,构造函数和析构函数。工作正常...... =)
答案 0 :(得分:2)
为什么所有的指针?
这可以作为您班级内的数据存储工作:
std::map<std::pair<I, I>, T>
I
是您的索引类型(例如int
),而T
是您的数字类型(例如,双倍)。
或者您可以使用boost::ublas
中的compressed_matrix
。