Partage
  • Partager sur Facebook
  • Partager sur Twitter

Class set de la STL

Conteneur std::set<> et types dérivés

    16 octobre 2020 à 13:23:50

    Salut à tous!!!

    Alors mon problème est le suivant, j'ai voulu utiliser un type class dans un conteneur de type std::set. J'arrive à créer la variable sans problème (std::set<type class>) mais ça coince dès que j'essaie d'utiliser une méthode que ce soit insert() ou erase().

    Ce qui m'amène à cette question, pour utiliser un type dérivé (class, struct etc...)dans un conteneur std::set faut-il surcharger certains opérateurs en particulier ?

    Et si je suis complètement à côté de la plaque que faut-il faire ?

    Merci d'avance.

    -
    Edité par Disiner 16 octobre 2020 à 13:28:54

    • Partager sur Facebook
    • Partager sur Twitter
      16 octobre 2020 à 14:35:25

      Salut.

      > ça coince

      Soit plus précis.

      • 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.
        16 octobre 2020 à 15:03:27

        Au faite ce que je veux dire par là c'est que j'ai une erreur de compilation (no match for 'operator<') et en voyant cela je suis allé surchargé l'opérateur dont il est question dans ma classe, mais même avec ça j'ai toujours la même erreur de compilation.
        • Partager sur Facebook
        • Partager sur Twitter
          16 octobre 2020 à 16:43:23

          Bonjour,

          En effet, un std::set à besoin de trier ses objets (ça lui sert aussi à vérifier l'unicité des objets), donc il est nécessaire d'implémenter cet operator<. On peut aussi transmettre à std::set comment trier les objets mais c'est un peu plus lourd à gérer. Si tu as la même erreur c'est que tu n'as pas bien implémenté l'operator<.

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            16 octobre 2020 à 16:47:02

            On ne peut pas ^etre devins. Effectivement, le type des clés dans les map et les set doivent pouvoir ^etre ordonnés avec l'opérateur <.

            struct Foo {
                ....
            
                friend bool operator<(Foo const& lhs, Foo const& rhs) noexcept {
                    return .....
                }
            private:
                ....
            };

            (Cet exemple minimaliste est la meilleure façon de définir l'opérateur <: hidden-friend, libre et symétrique, garantie sans exception. Comme Dalfab l'a dit, on peut injecter le prédicat de comparaison d'autres façons)

            (pour ceux qui déterreront dans quelques années, en C++20, on surchargera à la place le space-ship operator, peut-^etre juste avec un `= default`  selon les champs de la classe)

            -
            Edité par lmghs 16 octobre 2020 à 16:50:17

            • 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.
              16 octobre 2020 à 18:10:01

              Okay merci les amis, je vous revoudrais ça
              • Partager sur Facebook
              • Partager sur Twitter

              Class set de la STL

              × 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