Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajouter une valeur nulle a un vecteur

Sujet résolu
    14 avril 2022 à 10:33:10

    Salut

    Je voudrais pouvoir faire un vecteur.push_back(null) ou .push_back(nullptr) mais c'est impossible. 

    Voici la fonction en question tout d'abord:

    std::vector<double> operator/(std::vector<double> const &vecteur_a, std::vector<double> const &vecteur_b)
    {
        assert(vecteur_a.size() == vecteur_b.size() && "Division impossible, les vecteurs doivent etre de meme taille");
        std::vector<double> vecteur_c;
        for (int i = 0; i < vecteur_a.size(); i++)
        {
            assert(vecteur_b[i] != 0 && "Division impossible avec un denominateur nul");
            // if (vecteur_b[i] == 0)
                // vecteur_c.push_back(NULL);
            vecteur_c.push_back(vecteur_a[i] / vecteur_b[i]);
        }
        return vecteur_c;
    }

    Le dénominateur pouvant être nul dans certains cas de mon problème je dois retirer le assert() et rajouter une valeur disons non comparable(parce que plus tard je dois retourner le plus grand ou plus petit élément de ce vecteur). C'est pour cette raison que je souhaites faire un push_back(null ou none...)

    Comment puis-je m'y prendre svp ?
     

    • Partager sur Facebook
    • Partager sur Twitter
      14 avril 2022 à 10:39:23

      Salut !

      C'est un vector de double, donc il faut mettre des double.

      Mathématiquement, si tu dis que le dénominateur peut être nul, ça veut dire qu'il peut valoir 0.0  

      Pourquoi tu ne mets pas 0.0 ?

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        14 avril 2022 à 10:42:54

        Dans le cours lorsque le dénominateur est nul on met l'infini, ou rien du tout. Dans la comparaison si on me demande le plus petit element la comparaison se fera entre les autres elements, infini non compris a l'intérieur. En mettant 0 je peux fausser la comparaison. De plus que je ne sais pas si on demanderas le plus grand élément ou le plus petit.
        • Partager sur Facebook
        • Partager sur Twitter
          14 avril 2022 à 10:48:30

          Les doubles peuvent représenter les infinis et les NaN. C'est probablement ce que tu veux utiliser. Nullptr c'est pour les pointeurs, pas les nombres.

          https://en.cppreference.com/w/cpp/types/numeric_limits 

          -
          Edité par gbdivers 14 avril 2022 à 10:48:38

          • Partager sur Facebook
          • Partager sur Twitter
            14 avril 2022 à 11:05:21

            Merci. J'ai fais un: 

                    // assert(vecteur_b[i] != 0 && "Division impossible avec un denominateur nul");
                    if (vecteur_b[i] == 0)
                        vecteur_c.push_back(std::numeric_limits<double>::quiet_NaN());

            C'est bon maintenant. Merci.

            Autre question qui n'a rien a voir s'il vous plait. J'ai une fonction qui affiche les éléments d'un vecteur. Je veux afficher des std::vector<double> <std::size_t> et meme <int>. Je me retrouve avec 03 fonctions qui font strictement la même chose. par quoi puis-je remplacer ces types pour avoir une seule et meme fonction? 

            • Partager sur Facebook
            • Partager sur Twitter
              14 avril 2022 à 11:10:53

              Au lieu de mettre 3 fonctions avec le type exact. Utilise le nom que tu veux à la place de int/double/..., typiquement T, et rajoute devant la fonction: "template <typename T>". Mets ça dans un .h, et voilà, tu as ta première fonction générique (template).

              Question, ne voudrais-tu pas rejeter cette division membre à membre si le vecteur "dénominateur" contient des 0? N'est-ce pas une erreur de programmation de la part de l'appelant?

              -
              Edité par lmghs 14 avril 2022 à 11:11:26

              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                14 avril 2022 à 11:14:45

                >Question, ne voudrais-tu pas rejeter cette division membre à membre si le vecteur "dénominateur" contient des 0? N'est-ce pas une erreur de programmation de la part de l'appelant? 

                Non c'est un cas rencontré dans la résolution du simplexe. C'est pas l'utilisateur qui entre ces valeurs, ce genre de division peut arriver.

                >Au lieu de mettre 3 fonctions avec le type exact. Utilise le nom que tu veux à la place de int/double/..., typiquement T, et rajoute devant la fonction: "template <typename T>". Mets ça dans un .h, et voilà, tu as ta première fonction générique (template). 

                Merci.

                • Partager sur Facebook
                • Partager sur Twitter
                  14 avril 2022 à 11:18:44

                  On peut tout à fait diviser des double quand le dénominateur est nul. on obtient alors un résultat qui peut être +Infini, -Infini ou bien NaN pour le cas 0./0..
                  Ensuite tu peux vérifier que le double obtenu est viable en le testant avec la fonction std::isfinite(x) qui retourne true sauf si le nombre est un infini ou NaN.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  En recherche d'emploi.

                    14 avril 2022 à 11:45:40

                    Dalfab a écrit:

                    On peut tout à fait diviser des double quand le dénominateur est nul. on obtient alors un résultat qui peut être +Infini, -Infini ou bien NaN pour le cas 0./0...


                    Dis comme ca c'est comme si cette division par 0 était connue et gérée par le compilateur, ce qui n'est pas le cas

                    -
                    Edité par Asmitta 14 avril 2022 à 11:46:01

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 avril 2022 à 12:07:13

                      Asmitta a écrit:

                      Dalfab a écrit:

                      On peut tout à fait diviser des double quand le dénominateur est nul. on obtient alors un résultat qui peut être +Infini, -Infini ou bien NaN pour le cas 0./0...


                      Dis comme ca c'est comme si cette division par 0 était connue et gérée par le compilateur, ce qui n'est pas le cas

                      -
                      Edité par Asmitta il y a 16 minutes


                      Le standard IEEE754 pour les nombres flottants utilisé partout de nos jours autorise complètement la division par zéro et le résultat est bien défini (±a/0. = ±inf et 0./0. = NaN). Par contre une division entière par zéro c'est undefined behavior.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 avril 2022 à 12:48:52

                        Oui merci. Mes divisions entre double marchaient pas parce que en fait elles ne même s'exécutaient pas (assert()). 

                        Merci encore

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Ajouter une valeur nulle a un vecteur

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown