Le 09/08/2010 02:03, Gabriel Dos Reis a écrit :L'itérateur a conceptuellement accès au conteneur. Ils ont été inventés
justement pour ça : comme lien entre les algorithmes et les conteneurs,
de sorte à transformer un problème de complexité « n x p » en un
problème de complexité « n + p »
Donc pourquoi ne pas permettre l'accès au conteneur auquel
l'itérateur est rattaché ? Ça pourrait être utile de vérifier qu'un
itérateur est issu d'un conteneur plutôt qu'un autre. Par exemple :
Le 09/08/2010 02:03, Gabriel Dos Reis a écrit :
L'itérateur a conceptuellement accès au conteneur. Ils ont été inventés
justement pour ça : comme lien entre les algorithmes et les conteneurs,
de sorte à transformer un problème de complexité « n x p » en un
problème de complexité « n + p »
Donc pourquoi ne pas permettre l'accès au conteneur auquel
l'itérateur est rattaché ? Ça pourrait être utile de vérifier qu'un
itérateur est issu d'un conteneur plutôt qu'un autre. Par exemple :
Le 09/08/2010 02:03, Gabriel Dos Reis a écrit :L'itérateur a conceptuellement accès au conteneur. Ils ont été inventés
justement pour ça : comme lien entre les algorithmes et les conteneurs,
de sorte à transformer un problème de complexité « n x p » en un
problème de complexité « n + p »
Donc pourquoi ne pas permettre l'accès au conteneur auquel
l'itérateur est rattaché ? Ça pourrait être utile de vérifier qu'un
itérateur est issu d'un conteneur plutôt qu'un autre. Par exemple :
Le 08/08/2010 23:50, Alexandre Bacquart a écrit :Comme pour un pointeur. La sémantique est d'ailleurs étrangement proche,
non ? Itérateur ou pointeur, on dirait parfois le même objet, mais
déclaré différemment...
Sauf que ce n'est pas le même concept.
Le 08/08/2010 23:50, Alexandre Bacquart a écrit :
Comme pour un pointeur. La sémantique est d'ailleurs étrangement proche,
non ? Itérateur ou pointeur, on dirait parfois le même objet, mais
déclaré différemment...
Sauf que ce n'est pas le même concept.
Le 08/08/2010 23:50, Alexandre Bacquart a écrit :Comme pour un pointeur. La sémantique est d'ailleurs étrangement proche,
non ? Itérateur ou pointeur, on dirait parfois le même objet, mais
déclaré différemment...
Sauf que ce n'est pas le même concept.
Le 08/08/2010 06:38, Fabien LE LEZ a écrit :
> Comment le pourrait-il ? Tu ne lui passes pas le vector en
> question, mais juste un itérateur.
Justement, c'est un truc que je ne comprends toujours pas.
Comment un itérateur peut à la fois référencer un conteneur et
ne pas y avoir accès ?
Dans l'implémentation, un itérateur doit bien conserver des
références vers le conteneur. Rien que pour pouvoir progresser
dans la collection. Du coup, à l'instar d'un pointeur habile,
il pourrait fournir une fonction membre vers le conteneur
itéré ? Ou encore une fois c'est une question de découplage ?
Le 08/08/2010 06:38, Fabien LE LEZ a écrit :
> Comment le pourrait-il ? Tu ne lui passes pas le vector en
> question, mais juste un itérateur.
Justement, c'est un truc que je ne comprends toujours pas.
Comment un itérateur peut à la fois référencer un conteneur et
ne pas y avoir accès ?
Dans l'implémentation, un itérateur doit bien conserver des
références vers le conteneur. Rien que pour pouvoir progresser
dans la collection. Du coup, à l'instar d'un pointeur habile,
il pourrait fournir une fonction membre vers le conteneur
itéré ? Ou encore une fois c'est une question de découplage ?
Le 08/08/2010 06:38, Fabien LE LEZ a écrit :
> Comment le pourrait-il ? Tu ne lui passes pas le vector en
> question, mais juste un itérateur.
Justement, c'est un truc que je ne comprends toujours pas.
Comment un itérateur peut à la fois référencer un conteneur et
ne pas y avoir accès ?
Dans l'implémentation, un itérateur doit bien conserver des
références vers le conteneur. Rien que pour pouvoir progresser
dans la collection. Du coup, à l'instar d'un pointeur habile,
il pourrait fournir une fonction membre vers le conteneur
itéré ? Ou encore une fois c'est une question de découplage ?
Si on veut demeler tout ca, je crois qu'il faut faire du
standardese...
A savoir, il y a une spec (la norme), et des implementations.
La spec demande "un minimum", et les implementations peuvent
en faire plus.
Pour le cas de l'iterateur, on a par exemple, std::vector.
Tout ce que la norme demande a l'iterateur, c'est de pouvoir
etre incremente/decremente (ou avance/recule plus
bourrinement), et dereference.
Une implementation *peut* rajouter des verifications
supplementaires (en particulier pour le debug, mais ca n'est
pas obligatoire.
Si on prend "le modele de base" de std::vector, notre vieux tableau C
int t[10];
une implementation a minima d'un iterateur sera un bete pointeur sur un
element du tableau, e.g., int *p = t + 5;
bonne chance pour retrouver le tableau lui-meme a partir du
pointeur.
et pourtant, ca suffit pour avoir un iterateur conforme a la
norme.
1/ en oubliant bien sur la couche d'abstraction
supplementaire, puisqu'il faut pouvoir resizer le tableau,
mais bon, si on a un pointeur sur le tableau sous-jacent
a vector, l'iterateur peut tres bien etre pointeur sur
l'element du tableau.
2/ et un vector a forcement un tableau C comme implementation
sous-jacente. Pas dans C++98, mais c'est une des precisions
du TR1 si ma memoire est bonne...
Si on veut demeler tout ca, je crois qu'il faut faire du
standardese...
A savoir, il y a une spec (la norme), et des implementations.
La spec demande "un minimum", et les implementations peuvent
en faire plus.
Pour le cas de l'iterateur, on a par exemple, std::vector.
Tout ce que la norme demande a l'iterateur, c'est de pouvoir
etre incremente/decremente (ou avance/recule plus
bourrinement), et dereference.
Une implementation *peut* rajouter des verifications
supplementaires (en particulier pour le debug, mais ca n'est
pas obligatoire.
Si on prend "le modele de base" de std::vector, notre vieux tableau C
int t[10];
une implementation a minima d'un iterateur sera un bete pointeur sur un
element du tableau, e.g., int *p = t + 5;
bonne chance pour retrouver le tableau lui-meme a partir du
pointeur.
et pourtant, ca suffit pour avoir un iterateur conforme a la
norme.
1/ en oubliant bien sur la couche d'abstraction
supplementaire, puisqu'il faut pouvoir resizer le tableau,
mais bon, si on a un pointeur sur le tableau sous-jacent
a vector, l'iterateur peut tres bien etre pointeur sur
l'element du tableau.
2/ et un vector a forcement un tableau C comme implementation
sous-jacente. Pas dans C++98, mais c'est une des precisions
du TR1 si ma memoire est bonne...
Si on veut demeler tout ca, je crois qu'il faut faire du
standardese...
A savoir, il y a une spec (la norme), et des implementations.
La spec demande "un minimum", et les implementations peuvent
en faire plus.
Pour le cas de l'iterateur, on a par exemple, std::vector.
Tout ce que la norme demande a l'iterateur, c'est de pouvoir
etre incremente/decremente (ou avance/recule plus
bourrinement), et dereference.
Une implementation *peut* rajouter des verifications
supplementaires (en particulier pour le debug, mais ca n'est
pas obligatoire.
Si on prend "le modele de base" de std::vector, notre vieux tableau C
int t[10];
une implementation a minima d'un iterateur sera un bete pointeur sur un
element du tableau, e.g., int *p = t + 5;
bonne chance pour retrouver le tableau lui-meme a partir du
pointeur.
et pourtant, ca suffit pour avoir un iterateur conforme a la
norme.
1/ en oubliant bien sur la couche d'abstraction
supplementaire, puisqu'il faut pouvoir resizer le tableau,
mais bon, si on a un pointeur sur le tableau sous-jacent
a vector, l'iterateur peut tres bien etre pointeur sur
l'element du tableau.
2/ et un vector a forcement un tableau C comme implementation
sous-jacente. Pas dans C++98, mais c'est une des precisions
du TR1 si ma memoire est bonne...
On Mon, 09 Aug 2010 02:47:20 +0100, Mickaël Wolff
:
>Un itérateur est un objet qui référence un objet dans une
>collection. Et une collection n'est pas forcément contigüe.
Prenons un exemple : std::list<T>, une liste doublement chaînée.
À partir d'un itérateur, on doit pouvoir trouver l'élément
pointé, et construire un itérateur vers l'élément suivant et
l'élément précédent.
En d'autres termes, les données membres peuvent se résumer à :
class iterateur
{
T* element_pointe;
iterateur* precedent;
iterateur* suivant;
};
Ça permet de naviguer sur l'ensemble des éléments contenus,
sans jamais avoir un pointeur sur le std::list<T> proprement
dit.
On Mon, 09 Aug 2010 02:47:20 +0100, Mickaël Wolff
<mickael.wo...@laposte.net>:
>Un itérateur est un objet qui référence un objet dans une
>collection. Et une collection n'est pas forcément contigüe.
Prenons un exemple : std::list<T>, une liste doublement chaînée.
À partir d'un itérateur, on doit pouvoir trouver l'élément
pointé, et construire un itérateur vers l'élément suivant et
l'élément précédent.
En d'autres termes, les données membres peuvent se résumer à :
class iterateur
{
T* element_pointe;
iterateur* precedent;
iterateur* suivant;
};
Ça permet de naviguer sur l'ensemble des éléments contenus,
sans jamais avoir un pointeur sur le std::list<T> proprement
dit.
On Mon, 09 Aug 2010 02:47:20 +0100, Mickaël Wolff
:
>Un itérateur est un objet qui référence un objet dans une
>collection. Et une collection n'est pas forcément contigüe.
Prenons un exemple : std::list<T>, une liste doublement chaînée.
À partir d'un itérateur, on doit pouvoir trouver l'élément
pointé, et construire un itérateur vers l'élément suivant et
l'élément précédent.
En d'autres termes, les données membres peuvent se résumer à :
class iterateur
{
T* element_pointe;
iterateur* precedent;
iterateur* suivant;
};
Ça permet de naviguer sur l'ensemble des éléments contenus,
sans jamais avoir un pointeur sur le std::list<T> proprement
dit.