OVH Cloud OVH Cloud

iterator et const_iterator

6 réponses
Avatar
Fabien LE LEZ
Bonjour,

Prenons, pour fixer les idées, un
std::vector<int> v;

Avec un iterator, je peux modifier non seulement l'objet pointé, mais
aussi la structure du vector<>, par exemple rajouter un élément et
ainsi invalider tous les itérateurs.

Avec un const_iterator, je ne peux rien modifier du tout.

J'ai l'impression confuse qu'un semi_const_iterator, qui permettrait
de modifier l'objet pointé mais pas la structure du vector<>, serait
utile.

D'où ma question : y a-t-il un manque dans la STL ? Ou une erreur
d'analyse de ma part ? Ou est-ce que je ferais mieux de retourner me
coucher au lieu de couper les cheveux en 42 ?

Merci d'avance pour vos avis.



--
;-)

6 réponses

Avatar
mb
Fabien LE LEZ ha scritto:

Bonjour,

Prenons, pour fixer les idées, un
std::vector<int> v;

Avec un iterator, je peux modifier non seulement l'objet pointé, mais
aussi la structure du vector<>, par exemple rajouter un élément et
ainsi invalider tous les itérateurs.

Avec un const_iterator, je ne peux rien modifier du tout.

J'ai l'impression confuse qu'un semi_const_iterator, qui permettrait
de modifier l'objet pointé mais pas la structure du vector<>, serait
utile.

D'où ma question : y a-t-il un manque dans la STL ? Ou une erreur
d'analyse de ma part ? Ou est-ce que je ferais mieux de retourner me
coucher au lieu de couper les cheveux en 42 ?

Merci d'avance pour vos avis.


C'est une limitation connue de la bibliotheque STL, elle meme etant
la consequence d'une inadequation entre le langage C++ et la programmation
moderne.

Une solution est de passer a CSharp/.NET

Si tu es deja programmeur en C++, le passage est tres facile. Dans le
cas contraire, ce qui semble etre le cas compte tenu de la teneur
de ta question, tu trouveras de tres bons tutoriaux a ton niveau de
debutant.

Il ne faut pas s'attacher au passe lorsque l'informatique moderne
offre de si belles opportunites d'avenir.

MB



--

questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad

Avatar
Michaël Delva
Si tu es deja programmeur en C++, le passage est tres facile. Dans le
cas contraire, ce qui semble etre le cas compte tenu de la teneur
de ta question, tu trouveras de tres bons tutoriaux a ton niveau de
debutant.


:-D

Avatar
Fabien LE LEZ
On 11 Aug 2004 13:23:29 GMT, "Michaël Delva"
:

:-D


Ça s'appelle un troll (qui ne m'a guère étonné d'ailleurs, vu
l'auteur...)

Avatar
kanze
Fabien LE LEZ wrote in message
news:...

Prenons, pour fixer les idées, un
std::vector<int> v;

Avec un iterator, je peux modifier non seulement l'objet pointé, mais
aussi la structure du vector<>, par exemple rajouter un élément et
ainsi invalider tous les itérateurs.


Comment ? Avec un itérateur, tu peux visiter les éléments, mais non
modifier la topologie de la collection.

Avec un const_iterator, je ne peux rien modifier du tout.

J'ai l'impression confuse qu'un semi_const_iterator, qui permettrait
de modifier l'objet pointé mais pas la structure du vector<>, serait
utile.


Je crois que la distinction pourrait être utile dans le cas des
références à des std::vector. Je ne vois pas de rélévance pour les
itérateurs.

D'où ma question : y a-t-il un manque dans la STL ?


Je ne vois pas de solution à l'intérieur d'une bibliothèque. D'ailleur,
je ne vois pas de solution en général -- il faudrait que le langage
supporte deux degrées de const. Mais alors, pourquoi s'arrêter à deux ?

Une solution possible serait d'offrir un « view » du vector, quelque
chose du genre :

template< typename Collection >
class TopologicallyFixedView // trouver un meilleur nom...
{
public:
explicit TopologicallyFixedView(
Collection& collection )
: myCollection( &collection )
{
}

typedef Collection::iterator
iterator ;
typedef Collection::const_iterator
const_iterator ;
typedef Collection::value_type
value_type ;

iterator begin()
{
return myCollection.begin() ;
}
iterator end()
{
return myCollection.end() ;
}
const_iterator begin() const
{
return myCollection.begin() ;
}
const_iterator end() const
{
return myCollection.end() ;
}

value_type& operator[]( size_t index )
{
return myCollection[ index ] ;
}

// ...

private:
Collection* myCollection ;
// pointeur afin de supporter l'affectation.
} ;

Pour être vraiment général, je crois qu'il faudrait de la
méta-programmation pour que des typedef des types tels que
reverse_iterator soient conditionnels. (Note que ce n'est pas un
problème pour les fonctions. Si tu n'appelles pas la fonction, elle ne
doit pas être instantiée. Et donc, tu ne dois pas avoir d'erreur du fait
qu'elle n'existe pas dans Collection.)

Un problème potentiel avec les views : la durée de vie des objets. C'est
assez facile à se rétrouver avec un view dont la collection a été
détruite. Mais sinon, c'est un idiome très puissant.

--
James Kanze GABI Software http://www.gabi-soft.fr
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

Avatar
Fabien LE LEZ
On 12 Aug 2004 01:06:51 -0700, :

Comment ? Avec un itérateur, tu peux visiter les éléments, mais non
modifier la topologie de la collection.


Il est possible que mon problème vienne de l'abus de
for (...::iterator i= ....begin();...)


--
;-)

Avatar
James Kanze
Fabien LE LEZ writes:

|> On 12 Aug 2004 01:06:51 -0700, :

|> >Comment ? Avec un itérateur, tu peux visiter les éléments, mais non
|> >modifier la topologie de la collection.

|> Il est possible que mon problème vienne de l'abus de
|> for (...::iterator i= ....begin();...)

Dans quel sens ? Avec l'itérateur, tu ne peux pas modifier la topologie
de la collection. Et avec la collection même, tu peux modifier tout ce
que tu veux, que l'itérateur soit const ou non.

--
James Kanze
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