2011-09-18 3 views
4

je la classe simple Graph suivante, où pour chaque Node, je stocke un ensemble de Arcs sortant:Comment écrire un itérateur C++ standard?

#include <iostream> 
#include <vector> 
#include <map> 
#include <set> 

struct Arc { 
    char label; 
    int targetNode; 
}; 

struct Graph { 
    std::vector<int> nodes; 
    std::map< int, std::set<Arc*> > outgoingArcsPerNode; 
}; 

Comment puis-je fournir une norme C++ iterator sur tous les arcs dans le graphe (ordre de l'itération doesn 't matter) qui cache comment les arcs sont stockés dans le graphique?

Je voudrais l'utiliser semblable au suivant:

int main() { 
    Graph g; 
    for (Graph::const_iterator it = g.arcsBegin(); it != g.arcsEnd(); ++it) { 
    Arc* a = *it; 
    } 
} 

j'entendu parler de boost::iterator, mais je trouve confus. Peut-être que quelqu'un pourrait donner un indice pour l'utiliser dans ce cas?

+0

Peut-être juste faire 'typedef std const_iterator :: map <...> 'dans' Graph' et ensuite définir les fonctions (ie 'arcsBegin()' et 'arcsEnd()')? – quasiverse

+0

duplication possible de [Custom Iterator en C++] (http://stackoverflow.com/questions/839958/custom-iterator-in-c) –

Répondre

2

Si vous ne souhaitez pas utiliser boost, un coup d'oeil à ce que itérateurs doit fournir: STL documentation.

Sinon, vous pouvez utiliser boost iterator library. Voir le iterator_facade tutorial qui est très proche de ce que vous demandez.

+0

En plus de cela, j'ai trouvé que la lecture de la source STL était utile (http://www.sgi.com/tech/stl/download.html). Plus précisément, j'ai utilisé la documentation référencée ci-dessus pour trouver un itérateur similaire à la structure de données pour laquelle je l'écris (par exemple, les besoins de l'itérateur de ma structure de données étaient proches de ceux d'une liste stl ::, référencé ci-dessus dans cette réponse pour voir ce que l'itérateur tape une liste stl :: list utilisée). Ensuite, j'ai lu la source std :: list :: itérateur à partir du lien que je viens d'inclure. J'espère que cela pourra aider. – Homer6

1

Créer une classe qui a deux itérateurs à l'intérieur: un sur la carte et un autre sur l'ensemble.

Chaque ++ est appliqué pour définir iterator. Quand il atteint la fin, incrémenter l'itérateur et réinitialiser l'itérateur.

Aussi, vous pouvez utiliser boost :: iterator_facade - il ne sera pas aider à mettre en œuvre l'algorithme de l'itération, mais réduira votre effort pour rendre votre iterator compatible aux attentes STL ...