Partage
  • Partager sur Facebook
  • Partager sur Twitter

Besoin d'aide pour std::list et les itérateurs

Passer des éléments d'une list à l'autre

    13 octobre 2007 à 14:50:28

    Bonjour à tous,

    J'ai un souci pour passer des éléments d'une std::list à une autre.

    J'utilise pour cela la méthode splice, mais je fais sûrement une fausse manip au niveau des itérateurs car lorsque je veux faire une boucle pour déplacer successivement tous les éléments de la liste, le programme pars dans une boucle infini. :/

    Voila le code :

    1. #include <iostream>
    2. #include <list>
    3. int main(void)
    4. {
    5.     std::list<int> liste1;
    6.     std::list<int> liste2;
    7.     std::list<int>::iterator iter1;
    8.     std::list<int>::iterator iter2;
    9.     liste1.push_back(4);
    10.     liste1.push_back(5);
    11.     liste1.push_back(6);
    12.     std::cout << "le contenu de la liste1" << std::endl;
    13.     for (iter1 = liste1.begin(); iter1 != liste1.end(); iter1++)
    14.         std::cout << *iter1 << std::endl;
    15.     std::cout << "le contenu de la liste2" << std::endl;
    16.     for (iter2 = liste2.begin(); iter2 != liste2.end(); iter2++)
    17.         std::cout << *iter2 << std::endl;
    18.     for (iter1 = liste1.begin(); iter1 != liste1.end(); iter1++)
    19.     {
    20.         iter2 = liste2.end();
    21.         liste2.splice(iter2, liste1, iter1);
    22.         std::cout << *iter1 << std::endl;
    23.     }
    24.     std::cout << "le contenu de la liste1" << std::endl;
    25.     for (iter1 = liste1.begin(); iter1 != liste1.end(); iter1++)
    26.         std::cout << *iter1 << std::endl;
    27.     std::cout << "le contenu de la liste2" << std::endl;
    28.     for (iter2 = liste2.begin(); iter2 != liste2.end(); iter2++)
    29.         std::cout << *iter2 << std::endl;
    30.     return 0;
    31. }


    Et la sortie console me donne :

    le contenu de la liste1
    4
    5
    6
    le contenu de la liste2
    4
    134525872
    4
    134525872
    4
    134525872
    4
    134525872
    etc...


    La boucle qui est sensée transférer les éléments ne fonctionne pas du tout.
    Je suppose que le "134525872" correspond à une case mémoire "au pif" mais je ne comprend pas pourquoi iter1 la pointe.

    Et ce qui me perturbe encore plus c'est que l'élément valant 4 n'est apparemment pas transféré puisqu'il ressort 1 fois sur 2.

    Quelqu'un pourrait-il m'expliquer pourquoi ?

    Merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      13 octobre 2007 à 15:10:51

      Peut-etre que cet exemple t'aidera a comprendre:
      http://www.cplusplus.com/reference/stl/list/splice.html
      (en anglais)
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        13 octobre 2007 à 18:13:21

        Ouaip, merci.

        En fait l'itérateur n'est plus valable une fois que l'élément est transféré.
        Il faut donc repartir du début et l'avancer du bon nombre d'éléments.

        Je ne comprend toujours pas le résultat précédent, mais au moins maintenant je sais comment l'éviter.
        • Partager sur Facebook
        • Partager sur Twitter

        Besoin d'aide pour std::list et les itérateurs

        × 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