Partage
  • Partager sur Facebook
  • Partager sur Twitter

Modifier un élément quelconque dans une liste.

    9 février 2019 à 19:14:42

    Bjr à tous.

    Dans le cour sur les conteneurs, j'ai cru comprendre qu'un des avantages des listes chainées est de pouvoir modifier un élément quelconque (pas seulement le début et la fin), mais il n'y avait pas d'exemple concret (juste des exemples permettant de les parcourrir avec un itérateur). Alors ma question est la suivante: comment modifier l'élément situé au milieu par exemple?
    • Partager sur Facebook
    • Partager sur Twitter
      9 février 2019 à 20:05:09

      Bonjour,

      Un cours ne peut contenir les dizaines de milliers de fonctions de la bibliothèque standard. Pour plus d'information il faut voir la doc des std::list.

      Le problème que tu rencontres est : comment accéder au milieu d'une std::list. Et là, il n'y a pas vraiment de solution car il n'existe aucun moyen d'accéder à un élément autre que les extrémités, les autres éléments ne sont trouvés qu'après un parcours.

      // ôter l'élément qui vaut 3
      std::list<int>  liste{0,1,2,3,4,5};
      auto  iter  =  std::find( liste.begin(), liste.end() , 3 );
      liste.erase( iter );          // supprimer l'élément trouvé
      • Partager sur Facebook
      • Partager sur Twitter
      Bjarne Stroustrup : "C++ has become too expert friendly"
        9 février 2019 à 22:08:13

        Salut,

        Attention, tu dis "on peut modifier un élément quelconque" : meme avec un vector tu peux modifier un élément quelconque.

        La liste a l'avantage de pouvoir insérer un nouvel élément à une place quelconque, nuance.

        • Partager sur Facebook
        • Partager sur Twitter

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

          9 février 2019 à 23:25:21

          int main()
          {
              vector<string> svect{"abbc","test","45dd5q5","98ded8"};
              list  <string> slist{"abbc","test","45dd5q5","98ded8"};
          
              svect.insert(svect.begin()+2,"here");
              for(auto it = svect.begin(); it != svect.end(); ++it)
                  cout<<*it<<" ";
          
              cout<<endl;
          
              auto itl = find(slist.begin(),slist.end(),"test");
              slist.insert((++itl),"ok!");
              for(auto it = slist.begin(); it != slist.end(); ++it)
                  cout<<*it<<" ";
          
              cout<<endl;
              return 0;
          }
          



          Ok. Merci bcp pour vos corrections.

          Mais, Fvirtman, avec le code précédent, (qui se compile bien), je suis arrivé à insérer dans un "vector" un élément quelconque à une place quelconque. Du coup, je ne vois plus trop la nuance, ou l'avantage des listes par rapport aux autres conteneurs.

          NB: l'exécution est bonne.

          -
          Edité par GiovanniAgbocou 9 février 2019 à 23:59:20

          • Partager sur Facebook
          • Partager sur Twitter
            10 février 2019 à 1:26:11

            La nuance est subtile. Insérer dans un std::vector veut dire déplacer tous les éléments. Le déplacement invalide les références, là où l'insertion dans une liste n'ajoute qu'un maillon entre 2 maillons. Les éléments ne bougent pas au niveau de la mémoire, seuls les liaisons sont différentes.

            #include <vector>
            #include <list>
            #include <iterator>
            
            int main()
            {
              {
                std::vector<int> v{1,2,3};
                auto it = std::next(v.begin());
                int& une_ref = *it; // une référence sur 2
                v.insert(it, 4);
                // Ici, une_ref ne correspond plus à 2, mais à 4.
                // Voir même à une zone mémoire invalide si le v a fait une allocation
                // il en va de même pour it
              }
              {
                std::list<int> l{1,2,3};
                auto it = std::next(l.begin());
                int& une_ref = *it; // une référence sur 2
                l.insert(it, 4);
                // Ici, une_ref est toujours sur 2 et it aussi
              }
            }

            Dans les faits, std::vector est préférable à std::list qui n'est pas très efficace au niveau mémoire. Les avantages des listes existent, mais dans des cas très particuliers. À mon d'avoir une réelle raison ou des benchmarks à l’appui, le plus simple est d'utiliser std::vector.

            -
            Edité par jo_link_noir 10 février 2019 à 1:30:25

            • Partager sur Facebook
            • Partager sur Twitter

            Modifier un élément quelconque dans une liste.

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown