begin process at 2010 03 19 12:37:30
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Algorithme

 > 

Maths

 > 

reproduction dans container STL


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

reproduction dans container STL

dimanche 13 mai 2007 à 02:02:22 | reproduction dans container STL

istdasklar

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


IDK
dimanche 13 mai 2007 à 10:04:00 | Re : reproduction dans container STL

luhtor

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 ?

void remove(const T& val); Removes all elements that compare equal to val. 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 size() comparisons for equality.

Je suis pas sur que c'est ce que tu veux. C'est plutot ca a mon avis:
iterator erase(iterator pos)Sequence Erases the element at position pos.

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++;
}
}
dimanche 13 mai 2007 à 12:05:34 | Re : reproduction dans container STL

istdasklar

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?

listLife<LIFE>:: iterator it;
listLife<LIFE>::iterator itEnd = listLife.end();

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
dimanche 13 mai 2007 à 12:26:29 | Re : reproduction dans container STL

luhtor

"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++;
}
dimanche 13 mai 2007 à 13:29:12 | Re : reproduction dans container STL

istdasklar


"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
dimanche 13 mai 2007 à 13:29:17 | Re : reproduction dans container STL

istdasklar


"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
dimanche 13 mai 2007 à 13:38:48 | Re : reproduction dans container STL

luhtor

Réponse acceptée !
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.


Cette discussion est classée dans : status, list, container, it, life


Répondre à ce message

Sujets en rapport avec ce message

Comment afficher la liste des fichiers dans le composant List View [ par kanimana ] Bonjour Svp, indiquez moi la fonction qui permettera d'afficher les fichier contenu dans un répertoire dans le composant ListView, avec les détails liste contenant un objet d'une de mes classes [ par Eric ] Salut,Je voudrais créer une liste contenant comme objet une de mes classes..par exemplelist ma_Liste_de_ma_Classe;mais je ne sais pas comment m'y pre mailing list [ par dragon ] c'est pas vraiment un appel a l'aide, mais c'était la section du forum qui me paressait la plus appropriéje suis codeur pour le mod StarCraft Tatal Co police et ListBox [ par JeriKo ] salut à tousça fait 2 heures que j'essaye de changer la police de ma listbox, y a rien à faire ça veut pas :(alors j'ai fait comme çaCListBox *list half life modification [ par baratrix ] salut,je suis un gros debutant en programmation (j'ai lu quelques lignes de pascal il y a une dizaine d'annee,mais c'est tout ) Mon boulot c'est plut list control [ par soshell ] Bonjour!J'ai un projet à finir dans 2 jours ( je sais c pas malin...) et j'ai commencé la prog windows hier, c pour ca ke j'ose mettre ce post dans au Appel au pros du Malloc [erreur etrange] [ par Manson ] Bonjour,j'aimerai lister le contenu d'un repertoire dans un tableau de char. Mon pb, c'est que lorsque je le fais, j'ai mon tableau qui ne se rempli p faire fonctionner une list box [ par lolman27 ] c tout con ms jarive pas a faire fonctionner une list box jarive pa a utiliser la fonction sendmessage quelqun pourrai me faire un code pour exemple s pb list box en VC++ [ par owel ] salut !!je voudrai faire un truc simple affiché le contenu d'un repertoire dans une list box mais je n'y arrive pas !la lecture du fichié pas de pb !m Erreur Template [ par yodasoft ] Bonjour , je suis nouveau sur ce site:J'ai une erreur sous Visual C++Il me met l'erreur suivante :guichet.obj : error LNK2001: unresolved external sym


Nos sponsors


Sondage...

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales