Помощь с указателями - PullRequest
       25

Помощь с указателями

1 голос
/ 30 декабря 2008

Я пишу разреженный матричный класс в 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++();//???
...
};

Буду признателен за любые советы или указания.

Обновление : он должен работать на всей матрице. Вот почему я думаю, что мне нужно переместить (по ссылке) массивы и размер матрицы. Предполагаемый эффект состоит в том, что это будет от последней ячейки в связанном списке первой строки до первой ячейки во второй строке.

Ответы [ 2 ]

1 голос
/ 30 декабря 2008

Не могли бы вы рассказать, что именно вы хотите сделать оператором ++ ()?

Например, чтобы оператор LIPointer ++ () перешел к следующему правому элементу:

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

Останавливается, когда доходит до конца.

1 голос
/ 30 декабря 2008

Для сжатых матриц строк я использую что-то вроде:

    std::vector<std::map<size_t, double> > matrix;

Затем я могу добавить запись, используя:

    matrix[row][col] += val;

Для каждой строки я могу затем перебирать записи столбцов в порядке возрастания и считывать значение.

Редактировать: Человек, задающий вопрос, указывает, что он не может использовать STL. Возможно, они могут использовать какую-то карту против связанного списка. В противном случае я предлагаю использовать вектор связанных списков и продолжать добавлять записи в конец каждого списка. Затем выполните сортировку каждого связанного списка, когда добавление записей завершено.

...