Voici une encapsulation assez normale d'un conteneur STL qui permet à l'utilisateur de Cfoo d'itérer le conteneur sans permettre de modifier les entrailles.itération de conteneurs STL imbriqués encapsulés
#include <vector>
class Cfoo
{
public:
class Cbar
{
/* contents of Cbar */
};
typedef std::vector<Cbar> TbarVector;
typedef TbarVector::const_iterator const_iterator;
public:
const_iterator begin() const { return(barVector_.begin()); }
const_iterator end() const { return(barVector_.end()); }
private:
TbarVector barVector_;
};
Jusqu'ici, tout va bien. On peut itérer le récipient comme celui-ci:
Cfoo myFoo;
for (Cfoo::const_iterator it = myFoo.begin(); it != myFoo.end(); ++it)
{
it->DoSomething();
}
Maintenant, je veux remplacer le std :: vecteur dire un std :: vecteur imbriqué:
public:
typedef std::vector<Cbar> TbarVectorInner;
typedef std::vector<TbarVectorInner> TbarVectorOuter;
private:
TbarVectorOuter barContainer_;
Mais je veux être en mesure de parcourir toutes les instances de Cbar de la même manière qu'avant, exposant un const_iterator, et une méthode const() const et const (end const).
Je ne sais pas comment faire cela, même si je suppose que cela implique l'écriture d'un itérateur personnalisé. Des pensées?
Il s'agit d'écrire un itérateur personnalisé. –
On dirait que le travail pour Flattening Iterator de http://stackoverflow.com/questions/3623082/flattening-iterator – Cubbi
'TbarVector' devrait être privé, il dit au monde extérieur des choses qui ne sont pas pertinentes et qui sont sujettes à une mauvaise utilisation . –