istdasklar
Messages postés15Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention30 mars 2011
-
13 mai 2007 à 02:02
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 2008
-
13 mai 2007 à 13:38
BOnjour... avis au amateur, j'ai trop du mal a jouer avec les container de la STL!
Mon programme doit simuler la reproduction d'entité vivante.
L'entité vivante est un objet LIFE, ou live() renvoie le status : JE_VIS, JE_ME_REPLIQUE, JE_MEURT.
En
gros, il s'agit de mettre des Life dans un container, de tester les
Life du container dans une boucle, et d' enlever ou d'ajouter une copie
dans dans le container en fct du status.
Exemple avec un list!
list <LIFE> listLife;
LIFE lifeDepart;
list.push_back(lifeDepart); //On part d'une entité.
list <LIFE>::iterator it;
While ( temps < tempsMax)
{
for ( it = 0; it!= listLife.end(); ++it)
{
int status = it->live();
if ( status == JE_ME_REPLIQUE)
list.push_back(&it);
if ( status == JE_MEURT)
list.remove(it);
}
}
Bon, bien sur ca marche pas!! Car je sais pas trop comment ca marche la liste! J'ai des segment faut et tout!
Et sinon, c'est quoi le mieux pour ce que je fait : list ? vector ? deques?
et
encore, comment je peux faire un parcours aleatoire de la liste? Car,
si je definit une population Maximum, je vais avoir des entités
vivantes avantagée.....Bref, bien compliqué tout ca!!
Bref, si on execute dans la boucle ça :
cout<<listLife.size()<<endl;
Je devrais avoir une suite exponentiel du type:
1,2,4,8,16,32 ....pMax
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 13 mai 2007 à 13:38
Ah ok, mais ya pas besoin de faire itEnd--; car itEnd change pas, si tu supprimes un élément, c'est pas un tableau que tu utilises mais une liste. itEnd reste le meme peu importe ce qu'il se passe pour les éléments précédents.
"//On supprime, donc la fin recule de 1 (La je suis pas sur) " <= La fin ne recule pas.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 13 mai 2007 à 10:04
La règle est simple:
- Ne jamais manipuler et modifier les itérateurs dans une boucle for, sauf si tu en fais une copie (enfin c'est délicat) donc jamais ! :)
Utilise une boucle while pour ca.
- Dans le meme genre, jamais de fonction erase dans le boucle for. j'ai des doutes pour la fonction remove.
list.push_back(&it); <= la j'ai du mal a voir ske tu fais.
list.push_back(*it); <= plutot.
Donc utilise une boucle while, en incrémentant toi meme l'itérateur et vérifie la définition de la fonction remove pour savoir ce qu'elle fait. L'itérateur en argument de la fonction, pointe apres sur l'élément suivant ou pas ?
<tt>void remove(const T& val);</tt>
Removes all elements that compare equal to <tt>val</tt>. The relative order
of elements that are not removed is unchanged, and iterators to
elements that are not removed remain valid. This function is
linear time: it performs exactly <tt>size()</tt> comparisons for equality.
Je suis pas sur que c'est ce que tu veux. C'est plutot ca a mon avis:
<tt>iterator erase(iterator pos)</tt>, Sequence, Erases the element at position <tt>pos</tt>.
Donc dans ta boucle while ca donnera:
it = list.erase(*it); <= et la attention !! ne pas incrémenter l'itérateur it, car ca deja été fait avec la fonction erase
Donc:
while (it != list.end())
{
// SI je supprime
{
it = list.erase(it); // it pointe apres la fonction sur l'élément suivant.
}
else // si j'ai pas besoin de supprimer
{
// Je fais mes trucs et j'incrémente it;
it++;
}
}
istdasklar
Messages postés15Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention30 mars 2011 13 mai 2007 à 12:05
Ok....desolé pour les erreurs, j'avais pas mon vrai code sur moi! J'ai donc réecris de tete!
Merci pour tes conseils precieux! Sinon, pour ajouter je dois modifier , pour que les elements que j'ajoute ne soit pas pris en compte dans la boucle en cours, mais dans la suivante. C'est bon ce qui suit?
while ( tps <= tpsMax)
{
while ( it != itEnd)
{
if ( SE_REPLIQUER) // On ajoute, mais ne seront pas tester
listLife.push_back(*it);
if ( SUPPRIMER)
{it = listLife.erase(it); itEnd--;} //On supprime, donc la fin recule de 1 (La je suis pas sur)
else it++;
}
itEnd = listLife.end(); // Fin du tour.... On prend en compte les derniers elements ajouté.
}
IDK
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 13 mai 2007 à 12:26
"tEnd = listLife.end();" <= inutile car c'est testé" dans le while. La valeur du pointeur "listLife.end()" change quand tu ajoutes des éléments.
listLife<LIFE>:: iterator it = listLife.begin(); <= Attention à bien initialiser le pointeur.
while ( it != listLife.end())
{
if ( SE_REPLIQUER)
listLife.push_back(*it); <= On ajoute des éléments a la fin, donc listLife.end() change.
if ( SUPPRIMER)
it = listLife.erase(it); <= si on supprime le dernier, alors erase renvoit listLife.End(),
il faut donc surtout pas incrémenter le pointeur apres.
else
it++;
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
istdasklar
Messages postés15Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention30 mars 2011 13 mai 2007 à 13:29
"tEnd = listLife.end();" <= inutile car c'est testé" dans le while.
La valeur du pointeur "listLife.end()" change quand tu ajoutes des
éléments.
Bein, justement! Je veux pas! Si j'ajoute un element, qui est testé dans la meme boucle, celui ci, va se repliquer aussi, et ajouter un element et ainsi de suite... Je ne sortirai pas de la boucle!
IDK
istdasklar
Messages postés15Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention30 mars 2011 13 mai 2007 à 13:29
"tEnd = listLife.end();" <= inutile car c'est testé" dans le while.
La valeur du pointeur "listLife.end()" change quand tu ajoutes des
éléments.
Bein, justement! Je veux pas! Si j'ajoute un element, qui est testé dans la meme boucle, celui ci, va se repliquer aussi, et ajouter un element et ainsi de suite... Je ne sortirai pas de la boucle!
IDK