[c ++ / pointeurs]: ayant des objets A et B (B est membre de vecteur, qui stocke le pointeur à A), A savoir est-il possible de récupérer le pointeur à B?

StackOverflow https://stackoverflow.com/questions/1464758

Question

Tout en essayant d'apprendre c ++, j'ai essayé de mettre en œuvre la classe représentant très basique Trie. Je suis venu avec ce qui suit:

class Trie {
public:
    char data;
    vector<Trie* > children;

    Trie(char data);
    Trie* addChild(Trie* ch);    // adds child node

    (skipped others members/methods)

};

Méthode addChild vérifie si l'enfant ch avec les mêmes données est présent dans le vecteur enfants , sinon, il insère là, si oui -. renvoie un pointeur à l'enfant déjà existant

Maintenant, compte tenu de cet extrait de code:

Trie t('c');
Trie* firstchild = new Trie('b');
Trie* secondchild = new Trie('a');


firstchild->addChild(secondchild);
t.addChild(firstchild);

si je dois pointer secondchild , est-il possible de revenir en quelque sorte des pointeurs vers firstChild ou peut-être même t

Je voudrais savoir s'il possible de le faire, parce que la logique de mon code de travail doit traverser la structure arborescente « up » (de noeuds inférieurs à ceux du haut), au parent de l'objet courant. Actuellement, je suis en train d'utiliser la fonction récursive pour voyager vers le bas - mais je me demande s'il existe une autre façon

Je suis désolé si ci-dessus ne sait pas ou si je foiré quelque part, je suis plutôt inexpérimenté et écrit de ma mémoire, sans le code de travail.

Était-ce utile?

La solution

Vous devez ajouter quelque chose comme

Trie* parent;

ou

Trie* previoussibling;
Trie* nextsibling;

à la classe pour obtenir directement de firstchild à secondchild ou vice-versa, ou de remonter d'un des enfants à t.

Notez que si vous avez besoin de ce genre de relation, alors vous aurez besoin de plus d'entretien lors de l'ajout et la suppression des nœuds de garder tous les liens corrects.

Autres conseils

L'objet ne tient pas Trie la trace de l'objet parent. Son essentiellement similaire à la liste liée unique et vous ne pouvez pas traverser en arrière à moins que vous « savez » le parent.

class Trie {
public:
    char data;
    vector<Trie* > children;
    Trie* parent;

    Trie(char data):parent(NULL){}
    Trie* addChild(Trie* ch)
    { //set the parent
     ch->parent = this;
    }

    (skipped others members/methods)

};

Alors traverserait ressembler à:

traverse(Trie* pPtr)
{
Trie* currentPtr = pPtr;
 while(currentPtr)
 {
  currentPtr = currentPtr->parent;
 }

}

  

Je n'ai que pointeur vers secondchild,   est-il possible de revenir en quelque sorte   pointeurs vers firstChild ou peut-être même   t?

Non. Vous devez établir cette relation de votre auto en passant le firstChild en tant que parent du deuxième enfant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top