Par contre, je ne comprend pas ton résonnement pour "win".
Je n'avais pas bien regardé, et effectivement, tu mets un "i = max" ce qui te fait sortir de la boucle. Néanmoins, c'est un peu bizarre (pas faux du tout, évidemment), généralement, on fait cela avec une boucle while, et on change rarement la condition de fin d'une boucle for (ce ne sont que des conventions, mais quand on est habitué, ça fait bizarre :p).
Sinon, si ton but est de simplement quitter la fonction dès la réponse connue, pourquoi ne pas faire directement:
bool verifWin() const
{
assert(!m_individuID.empty());
auto tmp = m_individuID[0];
auto max = m_individuID.size();
for (int i = 1; i < max; ++i)
{
if (m_individuID[i] == tmp)
m_individuWinner = m_individuID[i];
else
return false;
}
return true;
}
Voir même:
bool verifWin() const
{
assert(!m_individuID.empty());
auto tmp = *m_individuID.begin();
for (auto individu : m_individuID)
if (individu != tmp)
return false;
m_individuWinner = tmp;
return true;
}
Le_BuG63
Messages postés11Date d'inscriptionlundi 24 octobre 2011StatutMembreDernière intervention 6 novembre 2017 17 déc. 2014 à 19:32
Je te remercie pour ton commentaire.
J'ai tout changé ce que tu m'as dit, et c'est bien plus sympa comme ça ! Par contre, je ne comprend pas ton résonnement pour "win". Si le gène est différent du gène d'avant, alors il n'y a pas de vainqueur, tout simplement. C'est peut être aussi moi qui ai mal comprit.
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 15 déc. 2014 à 14:19
Bonjour.
Quelques questions/remarques:
- Pourquoi ne pas utiliser un std::vector pour m_individuID ? (avec un resize si on connaît déjà la taille). Ça éviterait un reliquat du C et ça corrigerait indirectement un bug dans ton code (il faut faire un delete[] et non un delete).
- Plutôt qu'un u32_t personnalisé pourquoi ne pas directement utiliser le standard uint32_t, qui est dans le header <cstdint> ?
- Vu que tu es en C++11, pourquoi utiliser le vieux srand/rand plutôt qu'un random_generator du nouveau header <random> ?
- La valeur de "win" dans la boucle for de ta méthode verifWin() me parait suspicieuse. En effet, tu changes la valeur de win de telle manière à ce que cela revienne strictement à ne vérifier que si le dernier éléments de ta liste vérifie ton prédicat. Est-ce vraiment ce que tu veux faire ? Si oui, alors tu peux ne tester que le dernier élément, non ?
- Certaines méthodes ne devraient-elles pas être dans un mode de visibilité différent de public ? D'après ton exemple, exposer seulement "setIndividu" et "processMutation" semble suffisant.
- Je rajouterais dans ton code, un peu plus d'assert (via <cassert>), notamment pour s'assurer que certains cas n'arriveront jamais (je pense par exemple à "tmp = m_individuID[0]", qui se base fortement sur le prédicat que "!m_individuID.empty()", et qui mériterait bien un petit assert :p).
- Pour paufiner un peu, je rajouterais aussi dans la description que c'est du C++11 et non du C++03 classique. Le C++11 n'est pas encore le mode par défaut de la plupart des compilateurs (malheureusement).
Modifié par cptpingu le 18/12/2014 à 18:28
Je n'avais pas bien regardé, et effectivement, tu mets un "i = max" ce qui te fait sortir de la boucle. Néanmoins, c'est un peu bizarre (pas faux du tout, évidemment), généralement, on fait cela avec une boucle while, et on change rarement la condition de fin d'une boucle for (ce ne sont que des conventions, mais quand on est habitué, ça fait bizarre :p).
Sinon, si ton but est de simplement quitter la fonction dès la réponse connue, pourquoi ne pas faire directement:
Voir même:
17 déc. 2014 à 19:32
J'ai tout changé ce que tu m'as dit, et c'est bien plus sympa comme ça ! Par contre, je ne comprend pas ton résonnement pour "win". Si le gène est différent du gène d'avant, alors il n'y a pas de vainqueur, tout simplement. C'est peut être aussi moi qui ai mal comprit.
15 déc. 2014 à 14:19
Quelques questions/remarques:
- Pourquoi ne pas utiliser un std::vector pour m_individuID ? (avec un resize si on connaît déjà la taille). Ça éviterait un reliquat du C et ça corrigerait indirectement un bug dans ton code (il faut faire un delete[] et non un delete).
- Plutôt qu'un u32_t personnalisé pourquoi ne pas directement utiliser le standard uint32_t, qui est dans le header <cstdint> ?
- Vu que tu es en C++11, pourquoi utiliser le vieux srand/rand plutôt qu'un random_generator du nouveau header <random> ?
- La valeur de "win" dans la boucle for de ta méthode verifWin() me parait suspicieuse. En effet, tu changes la valeur de win de telle manière à ce que cela revienne strictement à ne vérifier que si le dernier éléments de ta liste vérifie ton prédicat. Est-ce vraiment ce que tu veux faire ? Si oui, alors tu peux ne tester que le dernier élément, non ?
- Certaines méthodes ne devraient-elles pas être dans un mode de visibilité différent de public ? D'après ton exemple, exposer seulement "setIndividu" et "processMutation" semble suffisant.
- Je rajouterais dans ton code, un peu plus d'assert (via <cassert>), notamment pour s'assurer que certains cas n'arriveront jamais (je pense par exemple à "tmp = m_individuID[0]", qui se base fortement sur le prédicat que "!m_individuID.empty()", et qui mériterait bien un petit assert :p).
- Pour paufiner un peu, je rajouterais aussi dans la description que c'est du C++11 et non du C++03 classique. Le C++11 n'est pas encore le mode par défaut de la plupart des compilateurs (malheureusement).