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 ?
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 ?
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 ?
Non, je n'en connais pas
typedef typename Container< Contained<T> >::iterator iterator_c;
typedef typename Contained<T>::iterator iterator_d;
container_iterator( const container_iterator& it
/*, pass container ?*/ );
container_iterator& operator=( const container_iterator& it );
//...
Peut être faudrait il garder une reférence sur le container
mais ça rends l'interface moins sympa.
Non, je n'en connais pas
typedef typename Container< Contained<T> >::iterator iterator_c;
typedef typename Contained<T>::iterator iterator_d;
container_iterator( const container_iterator& it
/*, pass container ?*/ );
container_iterator& operator=( const container_iterator& it );
//...
Peut être faudrait il garder une reférence sur le container
mais ça rends l'interface moins sympa.
Non, je n'en connais pas
typedef typename Container< Contained<T> >::iterator iterator_c;
typedef typename Contained<T>::iterator iterator_d;
container_iterator( const container_iterator& it
/*, pass container ?*/ );
container_iterator& operator=( const container_iterator& it );
//...
Peut être faudrait il garder une reférence sur le container
mais ça rends l'interface moins sympa.
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");
Iterateur it= ....
assert (*it == 'a'); ++it
assert (*it == 'b'); ++it
assert (*it == 'c'); ++it
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");
Iterateur it= ....
assert (*it == 'a'); ++it
assert (*it == 'b'); ++it
assert (*it == 'c'); ++it
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");
Iterateur it= ....
assert (*it == 'a'); ++it
assert (*it == 'b'); ++it
assert (*it == 'c'); ++it
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 ?
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 ?
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 ?
Le problème est bien dans ce "..." ; plus précisément, dans l'opérateur
++().
Le problème est bien dans ce "..." ; plus précisément, dans l'opérateur
++().
Le problème est bien dans ce "..." ; plus précisément, dans l'opérateur
++().
On Tue, 10 Jul 2007 17:11:45 +0200, Michael DOUBEZ
Le problème est bien dans ce "..." ; plus précisément, dans
l'opérateur ++().Peut être faudrait il garder une reférence sur le container
Un pointeur, en fait. Sinon l'itérateur ne sera pas assignable.mais ça rends l'interface moins sympa.
J'ai bien l'impression, effectivement, qu'il va falloir passer le
conteneur lui-même au constructeur de l'itérateur.
On Tue, 10 Jul 2007 17:11:45 +0200, Michael DOUBEZ
Le problème est bien dans ce "..." ; plus précisément, dans
l'opérateur ++().
Peut être faudrait il garder une reférence sur le container
Un pointeur, en fait. Sinon l'itérateur ne sera pas assignable.
mais ça rends l'interface moins sympa.
J'ai bien l'impression, effectivement, qu'il va falloir passer le
conteneur lui-même au constructeur de l'itérateur.
On Tue, 10 Jul 2007 17:11:45 +0200, Michael DOUBEZ
Le problème est bien dans ce "..." ; plus précisément, dans
l'opérateur ++().Peut être faudrait il garder une reférence sur le container
Un pointeur, en fait. Sinon l'itérateur ne sera pas assignable.mais ça rends l'interface moins sympa.
J'ai bien l'impression, effectivement, qu'il va falloir passer le
conteneur lui-même au constructeur de l'itérateur.
Quelqu'un aurait-il une implémentation de référence, testée, fi able et
élégante, que je mettrais une fois pour toutes dans ma boîte à
outils ?
Il y a dans boost::iterator des outils pour créer ses propres itérate urs
en écrivant juste 2/3 fonctions. Ca peut aider à implémenter.
Par contre, je ne connais pas de solution qui fasse directement ce que
tu souhaites.
Quelqu'un aurait-il une implémentation de référence, testée, fi able et
élégante, que je mettrais une fois pour toutes dans ma boîte à
outils ?
Il y a dans boost::iterator des outils pour créer ses propres itérate urs
en écrivant juste 2/3 fonctions. Ca peut aider à implémenter.
Par contre, je ne connais pas de solution qui fasse directement ce que
tu souhaites.
Quelqu'un aurait-il une implémentation de référence, testée, fi able et
élégante, que je mettrais une fois pour toutes dans ma boîte à
outils ?
Il y a dans boost::iterator des outils pour créer ses propres itérate urs
en écrivant juste 2/3 fonctions. Ca peut aider à implémenter.
Par contre, je ne connais pas de solution qui fasse directement ce que
tu souhaites.
Je ne vois pas de probleme:
Je ne vois pas de probleme:
Je ne vois pas de probleme:
On 11 Jul 2007 09:03:15 +0200, Jean-Marc Bourguet :Je ne vois pas de probleme:
Imagine un vector<string> contenant ceci :
"abc"
""
"def"
""
""
Si on est sur 'c', ++() doit faire arriver sur 'd'.
Si on est sur 'f', ++() doit faire arriver sur un itérateur égal à
end.
On 11 Jul 2007 09:03:15 +0200, Jean-Marc Bourguet <jm@bourguet.org>:
Je ne vois pas de probleme:
Imagine un vector<string> contenant ceci :
"abc"
""
"def"
""
""
Si on est sur 'c', ++() doit faire arriver sur 'd'.
Si on est sur 'f', ++() doit faire arriver sur un itérateur égal à
end.
On 11 Jul 2007 09:03:15 +0200, Jean-Marc Bourguet :Je ne vois pas de probleme:
Imagine un vector<string> contenant ceci :
"abc"
""
"def"
""
""
Si on est sur 'c', ++() doit faire arriver sur 'd'.
Si on est sur 'f', ++() doit faire arriver sur un itérateur égal à
end.
On Tue, 10 Jul 2007 17:11:45 +0200, Michael DOUBEZ
:Non, je n'en connais pas
Dommage, j'aimerais justement quelque chose de déjà intensivement
testé.typedef typename Container< Contained<T> >::iterator iterator_c;
typedef typename Contained<T>::iterator iterator_d;
Du coup, il va falloir penser aussi à la version const_iterator...
Argh !
(Cela dit, je n'ai pour l'instant pas eu besoin de version non-const.)container_iterator( const container_iterator& it
/*, pass container ?*/ );
container_iterator& operator=( const container_iterator& it );
J'ai dans l'idée qu'on devrait pouvoir se contenter des constructeur
et opérateur de copie fournis par le compilo.
D'une manière générale, quand je conçois une classe, je ne défi nis ces
fonctions que si je n'ai vraiment pas le choix. Ce qui, en pratique,
est très rare.
Et//...
Le problème est bien dans ce "..." ; plus précisément, dans
l'opérateur ++().
Peut être faudrait il garder une reférence sur le container
Un pointeur, en fait. Sinon l'itérateur ne sera pas assignable.mais ça rends l'interface moins sympa.
J'ai bien l'impression, effectivement, qu'il va falloir passer le
conteneur lui-même au constructeur de l'itérateur.
::value_type
value_type ;
::reference
reference ;
::difference_type
difference_type ; // pas trop sûr ici...
::value_type::const_iterator >
begin2D(
::value_type::const_iterator >(
c.begin(), c.end() ) ;
::value_type::const_iterator >
end2D(
::value_type::const_iterator >() ;
}
On Tue, 10 Jul 2007 17:11:45 +0200, Michael DOUBEZ
<michael.dou...@free.fr>:
Non, je n'en connais pas
Dommage, j'aimerais justement quelque chose de déjà intensivement
testé.
typedef typename Container< Contained<T> >::iterator iterator_c;
typedef typename Contained<T>::iterator iterator_d;
Du coup, il va falloir penser aussi à la version const_iterator...
Argh !
(Cela dit, je n'ai pour l'instant pas eu besoin de version non-const.)
container_iterator( const container_iterator& it
/*, pass container ?*/ );
container_iterator& operator=( const container_iterator& it );
J'ai dans l'idée qu'on devrait pouvoir se contenter des constructeur
et opérateur de copie fournis par le compilo.
D'une manière générale, quand je conçois une classe, je ne défi nis ces
fonctions que si je n'ai vraiment pas le choix. Ce qui, en pratique,
est très rare.
Et
//...
Le problème est bien dans ce "..." ; plus précisément, dans
l'opérateur ++().
Peut être faudrait il garder une reférence sur le container
Un pointeur, en fait. Sinon l'itérateur ne sera pas assignable.
mais ça rends l'interface moins sympa.
J'ai bien l'impression, effectivement, qu'il va falloir passer le
conteneur lui-même au constructeur de l'itérateur.
::value_type
value_type ;
::reference
reference ;
::difference_type
difference_type ; // pas trop sûr ici...
::value_type::const_iterator >
begin2D(
::value_type::const_iterator >(
c.begin(), c.end() ) ;
::value_type::const_iterator >
end2D(
::value_type::const_iterator >() ;
}
On Tue, 10 Jul 2007 17:11:45 +0200, Michael DOUBEZ
:Non, je n'en connais pas
Dommage, j'aimerais justement quelque chose de déjà intensivement
testé.typedef typename Container< Contained<T> >::iterator iterator_c;
typedef typename Contained<T>::iterator iterator_d;
Du coup, il va falloir penser aussi à la version const_iterator...
Argh !
(Cela dit, je n'ai pour l'instant pas eu besoin de version non-const.)container_iterator( const container_iterator& it
/*, pass container ?*/ );
container_iterator& operator=( const container_iterator& it );
J'ai dans l'idée qu'on devrait pouvoir se contenter des constructeur
et opérateur de copie fournis par le compilo.
D'une manière générale, quand je conçois une classe, je ne défi nis ces
fonctions que si je n'ai vraiment pas le choix. Ce qui, en pratique,
est très rare.
Et//...
Le problème est bien dans ce "..." ; plus précisément, dans
l'opérateur ++().
Peut être faudrait il garder une reférence sur le container
Un pointeur, en fait. Sinon l'itérateur ne sera pas assignable.mais ça rends l'interface moins sympa.
J'ai bien l'impression, effectivement, qu'il va falloir passer le
conteneur lui-même au constructeur de l'itérateur.
::value_type
value_type ;
::reference
reference ;
::difference_type
difference_type ; // pas trop sûr ici...
::value_type::const_iterator >
begin2D(
::value_type::const_iterator >(
c.begin(), c.end() ) ;
::value_type::const_iterator >
end2D(
::value_type::const_iterator >() ;
}