J'ai implémenté le modèle Visitor en C++ à l'aide d'un itérateur de type STL pour stocker la position actuelle du visiteur dans le conteneur. Maintenant, je voudrais changer le conteneur pendant que je le parcourir, et je suis particulièrement intéressé par la suppression d'éléments du conteneur, même celui que je suis en train de visiter.Modification d'un conteneur lors de l'utilisation de Visitor
Maintenant, évidemment, cela invalidera l'itérateur interne des visiteurs, car il indiquait exactement cet élément. Actuellement, je stocke une liste de tous les itérateurs dans le conteneur et les met à jour, dès que quelque chose est ajouté ou supprimé de la liste. Donc, d'une certaine manière, ceci est similaire au modèle Observer appliqué à l'itérateur (en tant qu'Observateur) et à la liste (en tant qu'Observable). Alternativement, j'ai considéré que les méthodes visitor() renvoyaient un indice au Visiteur sur ce qui arrivait à l'item courant et comment procéder à l'itération, mais cela ne semble pas non plus une bonne idée, parce que la visite() la mise en œuvre ne devrait pas vraiment se soucier de trouver l'article suivant. Donc, ma question est la suivante: Quelle est la meilleure façon de garder un visiteur au travail, même lorsque des éléments sont ajoutés ou retirés du conteneur.
Cordialement, Florian
Mise à jour: Il y a un visiteur en cours d'exécution sur le conteneur, mais à l'intérieur de la méthode visite() un certain nombre de itérateurs supplémentaires pourraient être utilisés sur le même récipient. Je souhaite que le visiteur continue avec les éléments restants dans le conteneur, même après le retour d'un appel à visit() dans lequel l'un des éléments du conteneur a été supprimé.
Je suis un peu confus par votre description. Avez-vous plusieurs visiteurs qui traversent le conteneur et qui doivent tous être mis à jour lorsqu'un visiteur apporte un changement? Voulez-vous que le visiteur revalide sa position chaque fois qu'il y a des changements apportés au conteneur - même par des entités qui ne sont pas des visiteurs? Ou est-ce que vous n'avez qu'un seul visiteur à la fois et que le visiteur doit toujours se quitter avec un itérateur valide après avoir visité un élément du conteneur? –
Je suis aussi confus. Je pense qu'une plus grande explication (ou code) sur la façon dont vous avez implémenté le visiteur sur le conteneur STL pourrait aider ici. Qu'est-ce que le visiteur accepte, l'objet et l'itérateur? Qui change les itérateurs pour que l'élément suivant soit visité? –