1

私は C++ で疎行列クラスを作成しています。このクラスでは、すべての行と列が、作成したクラス (適切な名前: LinkedList) からの連結リストの配列です。

このマトリックス内の 1 つのセルへの「スマート」ポインターであるクラスを作成したいと考えています。

そのクラスでは、たとえば、マトリックスのリンクされたリストを移動するためLIPointerの演算子関数を実装します。++

を作成するたびに行列配列とサイズ変更された要素の参照を移動せずにこれを行うエレガントな方法はありますlinkedlistPointerか?

stl::arrayetc. は自分で作らないといけないので使えません。

宣言は次のとおりです。


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++();//???
...
};

アドバイスや指示をいただければ幸いです。

更新:マトリックス全体で実行する必要があります。そのため、配列と行列のサイズを (参照により) 移動する必要があると思います。意図した効果は、これが最初の行のリンクされたリストの最後のセルから 2 番目の行の最初のセルになることです。

4

2 に答える 2

1

圧縮された行行列の場合、次のようなものを使用します。

    std::vector<std::map<size_t, double> > 行列;

次に、次を使用してエントリを追加できます。

    行列[行][列] += val;

行ごとに、列エントリを昇順で繰り返し処理し、値を読み取ることができます。

編集:質問をしている人は、STLを使用できないことを指摘しています。おそらく、リンクされたリストではなく、ある種のマップを使用できるでしょう。それ以外の場合は、リンクされたリストのベクトルを使用して、各リストの最後にエントリを追加し続けることをお勧めします。次に、エントリの追加が完了したら、各リンク リストの並べ替えを行います。

于 2008-12-30T10:09:39.617 に答える
1

operator++() に何をさせたいのか正確に説明していただけますか?

たとえば、LIPointer の operator++() を次の右の要素に移動させるには:

void operator++()
{
    if ( CellPointer != NULL )
        CellPointer = CellPointer->Right;
}

ただし、最後に来ると停止します。

于 2008-12-30T12:01:08.283 に答える