문제
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;
}
그래도 끝날 때 멈 춥니 다.