OVH Cloud OVH Cloud

iterateur sur map

15 réponses
Avatar
Zouplaz
Bonsoir, si j'écris

frameSeqIterator it;
for(it=m_frameSequences.begin();it!=m_frameSequences.end();it++)
delete (*it).second;

ceci étant défini :

typedef std::map<std::string,SpriteFrameSequence*> frameSeqMap;
typedef frameSeqMap::iterator frameSeqIterator;

frameSeqMap m_frameSequences;


Ma question du jour :

Est-ce que je dois écrire ++it au lieu de it++ ??
En fait, est-ce que je parcours bien (et détruit) tous les éléments de la
map en procédant de cette manière ?

Merci !

10 réponses

1 2
Avatar
Benoit Rousseau
Zouplaz wrote:
Bonsoir, si j'écris

frameSeqIterator it;
for(it=m_frameSequences.begin();it!=m_frameSequences.end();it++)
delete (*it).second;

Ma question du jour :

Est-ce que je dois écrire ++it au lieu de it++ ??
Aucune importance dans ton cas. Et dans celui des for en général.

for( c1 ; c2 ; c3 ) { P }
s'execute comme :
c1; if( c2 ) { P;
c3; if( c2 ) { P;
c3; ... }}

donc c3 === ++it ou c3 == it++ revient au même

En fait, est-ce que je parcours bien (et détruit) tous les éléments de la
map en procédant de cette manière ?
oui.

Mais pourquoi ne pas utiliser des pointeurs intelligents ;-)




--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/

Avatar
Zouplaz
Benoit Rousseau - :


oui.
Mais pourquoi ne pas utiliser des pointeurs intelligents ;-)



Parce que les pointeurs bêtes sont à la programmation ce que le Roquefort
est au Kiri !! Je suis pour le terroir et les choses "vraies" ! :-)))

Avatar
Bertrand Motuelle
Zouplaz wrote:
Bonsoir, si j'écris

frameSeqIterator it;
for(it=m_frameSequences.begin();it!=m_frameSequences.end();it++)
delete (*it).second;

ceci étant défini :

typedef std::map<std::string,SpriteFrameSequence*> frameSeqMap;
typedef frameSeqMap::iterator frameSeqIterator;


Il manque un typename ici:
typedef typename frameSeqMap::iterator frameSeqIterator;

frameSeqMap m_frameSequences;
Ma question du jour :

Est-ce que je dois écrire ++it au lieu de it++ ??
++it a l'avantage de ne pas creer de temporaire, et c'est comme ca que

personellement je prefere l'ecrire.
Mais les deux sont corrects.

Bertrand.

Avatar
Loïc Joly
Zouplaz wrote:

Bonsoir, si j'écris

frameSeqIterator it;
for(it=m_frameSequences.begin();it!=m_frameSequences.end();it++)
delete (*it).second;

ceci étant défini :

typedef std::map<std::string,SpriteFrameSequence*> frameSeqMap;
typedef frameSeqMap::iterator frameSeqIterator;

frameSeqMap m_frameSequences;


Ma question du jour :

Est-ce que je dois écrire ++it au lieu de it++ ??


Il y a potentiellement un leger coût en performance à écrire it++. C'est
à mesurer si nécessaire en fonction du projet, mais comme dans ce genre
de cas, je ne vois pas d'inconvénients à écrire ++it, j'ai pris
l'habitude d'écrire ça par défaut. Mais je ne corrigerais pas un code
avec it++ juste pour le plaisir.

En fait, est-ce que je parcours bien (et détruit) tous les éléments de la
map en procédant de cette manière ?


Oui

--
Loïc

Avatar
Christophe Lephay
Loïc Joly wrote:
Zouplaz wrote:
for(it=m_frameSequences.begin();it!=m_frameSequences.end();it++)
delete (*it).second;
En fait, est-ce que je parcours bien (et détruit) tous les éléments
de la map en procédant de cette manière ?


Oui


Encore que la question est ambigue : si les pointeurs sont bien effacés, les
éléments restent dans la map (qui sont donc invalides).
Ajoute un m_frameSequences.clear(); après ta boucle...

Chris


Avatar
tib.motuelle
Bertrand Motuelle wrote in message news:<bpdtg7$2p2e$...
Zouplaz wrote:
frameSeqIterator it;
for(it=m_frameSequences.begin();it!=m_frameSequences.end();it++)
delete (*it).second;

ceci étant défini :

typedef std::map<std::string,SpriteFrameSequence*> frameSeqMap;
typedef frameSeqMap::iterator frameSeqIterator;


Il manque un typename ici:
typedef typename frameSeqMap::iterator frameSeqIterator;


Oublie cette remarque, la ligne que tu as ecrite est correcte:
typedef frameSeqMap::iterator frameSeqIterator;

Toutes mes excuses.

Bertrand.


Avatar
Zouplaz
Christophe Lephay - :

Ajoute un m_frameSequences.clear(); aprŠs ta boucle...


Très bonne remarque !! Merci

Avatar
kanze
Zouplaz wrote in message
news:...

si j'écris

frameSeqIterator it;
for(it=m_frameSequences.begin();it!=m_frameSequences.end();it++)
delete (*it).second;

ceci étant défini :

typedef std::map<std::string,SpriteFrameSequence*> frameSeqMap;
typedef frameSeqMap::iterator frameSeqIterator;

frameSeqMap m_frameSequences;

Ma question du jour :

Est-ce que je dois écrire ++it au lieu de it++ ??


Égal. En théorie, dans certains cas, ++it pourrait être plus performant,
mais je n'ai jamais trouvé une différence mésurable. Sinon, c'est pareil
au même.

C-à-d un comportement indéfini selon la norme, mais pas de problème en
pratique.

En fait, est-ce que je parcours bien (et détruit) tous les éléments de
la map en procédant de cette manière ?


Si on fait abstraction du comportement indéfini (ce qu'on peut faire
sans souci dans la pratique), tu parcous tous les éléments de la map
dans les deux cas.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
Loïc Joly
wrote:


Est-ce que je dois écrire ++it au lieu de it++ ??



Égal. En théorie, dans certains cas, ++it pourrait être plus performant,
mais je n'ai jamais trouvé une différence mésurable. Sinon, c'est pareil
au même.

C-à-d un comportement indéfini selon la norme, mais pas de problème en
pratique.


Peux-tu préciser en quoi le comportement est indéfini ?

--
Loïc


Avatar
tib.motuelle
Loïc Joly wrote in message news:<bpgv6s$kd2$...
wrote:


Est-ce que je dois écrire ++it au lieu de it++ ??



Égal. En théorie, dans certains cas, ++it pourrait être plus performant,
mais je n'ai jamais trouvé une différence mésurable. Sinon, c'est pareil
au même.

C-à-d un comportement indéfini selon la norme, mais pas de problème en
pratique.


Peux-tu préciser en quoi le comportement est indéfini ?


Je pense que la remarque de James s'applique au fait que des pointeurs
sur objets deletés sont présents dans la collection.
Et une implémentation pourrait éventuellement manipuler ces objets
invalides (par exemple dans le destructeur de la collection) ce qui
est un comportement indéfini.
Dans la pratique ca ne pose pas de problème. Mais si on est un peu
parano, il faudrait écrire:

for(it=m_frameSequences.begin();it!=m_frameSequences.end();it++)
{
delete (*it).second;
it->second = 0; // on ajoute cette ligne
}

Je trouve qu'une bonne approche est d'encapsuler une fois pour toute
cette cuisine dans un foncteur avec plusieurs operateurs () (pour des
pointeurs simples, pour des pair dont l'élement second est un
pointeur), et d'utiliser for_each + ce foncteur.



1 2