[C++] Mutation

Le_BuG63 Messages postés 11 Date d'inscription lundi 24 octobre 2011 Statut Membre Dernière intervention 6 novembre 2017 - 10 déc. 2014 à 21:46
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 18 déc. 2014 à 18:21
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/100833-c-mutation

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 18/12/2014 à 18:28
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és 11 Date d'inscription lundi 24 octobre 2011 Statut Membre Derniè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és 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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).
Rejoignez-nous