2008-12-30 10 views
1

J'écris une classe de matrice clairsemée en C++ dans laquelle chaque ligne et chaque colonne sont des tableaux de listes chaînées provenant d'une classe que j'ai créée (appelée à juste titre: LinkedList).Aide de classe Pointer

Je veux écrire une classe qui est un pointeur "intelligent" à une cellule dans cette matrice.

Dans cette classe, disons LIPointer, je vais implémenter une fonction opérateur ++ pour déplacer dans les listes chaînées de la matrice.

Y at-il une manière élégante de faire ceci sans déplacer les références des matrices de matrice et des éléments de taille chaque fois que je crée un linkedlistPointer?

Je ne peux pas utiliser stl::array etc. parce que je dois les construire moi-même.

Voici les déclarations:


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

Tout conseil ou la direction seraient appréciés.

Mise à jour: Elle doit s'exécuter sur l'ensemble de la matrice. C'est pourquoi je pense que je dois déplacer (par référence) les tableaux et la taille de la matrice. L'effet prévu est que cela se produise de la dernière cellule de la liste liée de la première ligne à la première cellule de la deuxième rangée.

+0

Je ne suis pas sûr de ce que vous voulez faire. Dans l'opérateur ++(), ne pourriez-vous pas simplement faire CellPointer = CellPointer-> Right; ? Bien sûr, cela ne fonctionnerait que jusqu'à ce qu'il atteigne le bord droit de la matrice. – csl

+0

J'ai essayé de nettoyer la question autant que possible. On ne sait pas si je capte l'intention clairement ou non. –

Répondre

1

Pour les matrices de ligne compressées, j'utiliser quelque chose comme:

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

Je peux alors ajouter une entrée à l'aide:

 
    matrix[row][col] += val; 

Pour chaque ligne, je peux alors parcourir les entrées de la colonne dans l'ordre croissant commandez et lisez la valeur. Editer: La personne posant la question fait remarquer qu'elle ne peut pas utiliser le LIST. Peut-être qu'ils peuvent utiliser une sorte de carte par rapport à une liste chaînée. Sinon, je suggère d'utiliser un vecteur de listes liées et d'ajouter des entrées à la fin de chaque liste. Ensuite, faites une sorte de chaque liste liée lors de l'ajout des entrées a été achevée.

1

Pouvez-vous préciser exactement ce que vous voulez que l'opérateur ++() fasse?

Par exemple, pour avoir l'opérateur de LIPointer ++() aller à l'élément suivant à droite:

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

Il arrête quand il arrive à la fin, cependant.