OVH Cloud OVH Cloud

Iterateur sur une collection de collections

11 réponses
Avatar
Fabien LE LEZ
Bonjour,

Soit un tableau de tableaux.
Mettons, pour fixer les idées, un vector<string> :

vector<string> v;
v.push_back ("a");
v.push_back ("");
v.push_back ("bc");

J'aimerais créer un itérateur (façon STL) qui visite chaque élément.
Ici, j'aurais donc :

Iterateur it= ....
Iterateur it_fin= ...
assert (*it == 'a');
++it
assert (*it == 'b');
++it
assert (*it == 'c');
++it
assert (it == it_fin);


A priori, c'est relativement simple, mais bizarrement, toutes les
implémentations que j'ai tentées me déplaisent, me paraissent
inutilement compliquées.

Quelqu'un aurait-il une implémentation de référence, testée, fiable et
élégante, que je mettrais une fois pour toutes dans ma boîte à
outils ?

Merci d'avance...

1 réponse

1 2
Avatar
James Kanze
On Jul 11, 9:44 am, Michael DOUBEZ wrote:
On Tue, 10 Jul 2007 17:11:45 +0200, Michael DOUBEZ



[...]
J'ai bien l'impression, effectivement, qu'il va falloir passer le
conteneur lui-même au constructeur de l'itérateur.


Ou alors déléguer la construction de l'iterator à une classe.


À une fonction, plutôt, pour avoir l'induction automatique de
type. Qu'est-ce que tu préfères écrire :

std::vector< std::string > v ;
// ...
std::for_each(
iterator2d< std::vector::iterator, std::string::iterator >(
v.begin(), v.end() ),
iterator2d< std::vector::iterator, std::string::iterator >(),
doSomething ) ;

ou :

std::vector< std::string > v ;
// ...
std::for_each( begin2D( v ), end2D( v ), doSomething ) ;

template< class Container >
class visit_contained
{
public:
visit_contained( Container& conr );

container_iterator begin()const;
container_iterator end()const;

//
};


On pourrait aussi envisager un décorateur pour la collection,
mais à mon avis, c'est une solution d'un autre problème, pas de
ce problème-ci.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


1 2