如何创建稀疏矩阵作为列表列表? (C ++)

时间:2011-07-22 02:17:01

标签: c++ templates

问题是:是否可以使用以下稀疏列表实现创建稀疏矩阵?特别是,使用带有类模板的类模板(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中测试了插入和获取,构造函数和析构函数。工作正常...... =)

1 个答案:

答案 0 :(得分:2)

为什么所有的指针?

这可以作为您班级内的数据存储工作:

std::map<std::pair<I, I>, T> 

I是您的索引类型(例如int),而T是您的数字类型(例如,双倍)。

或者您可以使用boost::ublas中的compressed_matrix