문제

C ++에서 희소 행렬 클래스를 작성하는 모든 행과 열은 내가 만든 클래스 (Aptly Name : 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++();//???
...
};

모든 조언이나 방향에 감사드립니다.

업데이트: 전체 매트릭스에서 실행해야합니다. 그렇기 때문에 매트릭스의 배열과 크기를 참조하여 움직여야한다고 생각합니다. 의도 된 효과는 이것이 첫 번째 행의 링크 된 목록의 마지막 셀에서 두 번째 행의 첫 번째 셀에 이르기까지한다는 것입니다.

도움이 되었습니까?

해결책

압축 행 매트릭스의 경우 다음과 같은 것을 사용합니다.

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

그런 다음 다음을 사용하여 항목을 추가 할 수 있습니다.

    matrix[row][col] += val;

각 행에 대해 열 항목을 오름차순 순서로 반복하고 값을 읽을 수 있습니다.

편집 : 질문을 제기하는 사람은 STL을 사용할 수 없다는 것을 지적합니다. 아마도 그들은 어떤 종류의지도 대 링크 된 목록을 사용할 수 있습니다. 그렇지 않으면 링크 된 목록의 벡터를 사용하고 각 목록의 끝에 항목을 계속 추가하는 것이 좋습니다. 그런 다음 항목을 추가 할 때 각 링크 된 목록을 수행하십시오.

다른 팁

연산자 ++ ()가 원하는 일에 대해 정확히 설명해 주시겠습니까?

예를 들어 Lipointer의 연산자 ++ ()가 다음 오른쪽 요소로 이동하도록합니다.

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

그래도 끝날 때 멈 춥니 다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top