2010-06-20 5 views
0

J'ai cette situation:itérateur personnalisé: comment en garder la trace?

J'ai une classe qui garde la trace d'un tableau de pointeurs. J'ai construit un itérateur personnalisé qui boucle à travers ce tableau.

Mon problème est sur la façon de le rendre threadsafe, en particulier lors de l'incrémentation/décrémentation?

Voici un projet des parties pertinentes de ce que j'ai:

typedef fruit * iterator; 

class fruits 
{ 
    private: 
    fruit ** flist; 
    int n;  //keeps track of position in flist 
    int count; //number of fruits 

    public: 
    iterator begin() {n=0; return fruit[n];} 
    iterator end() {n=count; return fruit[n];} 

    iterator operator++() 
    { 
     return fruit[++n]; 
    } 
} 

Le problème que je vois est que si deux parties du programme créent une des choses iterator ne fonctionnera pas. Comment C++ STL gère-t-il cela?

MISE À JOUR: J'ai trouvé l'erreur de mes habitudes. L'itérateur doit garder une trace de l'endroit où il se trouve. Pour cela, j'ai créé une classe d'itérateur intégrée dans ma classe principale. La vie est maintenant bonne.

Répondre

5

Les conteneurs standard conservent leur état d'itération dans les objets itérateurs séparément du conteneur, de sorte qu'il peut y avoir plusieurs itérations sur le conteneur en même temps. Donc begin() et end() retournent les itérateurs, mais ne modifient pas l'état du conteneur; operator++ agit sur les itérateurs, pas sur le conteneur. Pour un simple tableau comme celui-ci, un pointeur (à un fruit*, pas un fruit) fonctionne parfaitement comme un iterator, de sorte que vous pouvez simplement définir begin() et end():

iterator begin() {return flist;} 
iterator end() {return flist + count;} 

et l'utiliser comme ceci:

for (iterator i = my_fruit.begin(); i != my_fruit.end(); ++i) 
    do_something_with(*i); // *i is a fruit* 

Il n'y a pas de problème avec plusieurs threads faisant cela en même temps, tant qu'aucun d'eux n'essaie de modifier le conteneur. D'un autre côté, à moins que ce soit un exercice d'apprentissage pour mieux comprendre le fonctionnement des conteneurs et des itérateurs, il vaut mieux utiliser std::vector plutôt que d'implémenter votre propre version.

+1

Merci d'avoir sauvegardé l'état else dans l'itérateur lui-même. –

Questions connexes