Partage
  • Partager sur Facebook
  • Partager sur Twitter

Début container

    23 avril 2023 à 4:34:57

    Hello, je viens du cours zestedesavoir et j'ai une question, j'ai ce programme

    int	main()
    {
    	std :: string	str{"Je veux supprimer des chars dans une string"};
    	std :: string :: iterator it{std :: remove(std :: begin(str), std :: end(str), 'e')};
    
    	std :: cout << str.size() << std :: endl;
    	std :: cout << str << std :: endl;
    	str.erase(it, std :: end(str));
    	std :: cout << str << std :: endl;
    	std :: cout << str.size() << std :: endl;
    	return (0);
    }

    Avant str.erase(), la taille reste la même malgré std :: remove et str est modifié mais avec des caractères indéfini j'ai l'impression.

    Ce que j'ai pu en conclure c'est que std::remove déplace les caractères que je veux supprimer à la fin, mais quand on parle de fin, on parle de quoi exactement ?

    std :: end pointe vers la fin me disent-ils, mais qu'en est-il vraiment ?

    J'ai fait un dessin assez moche mais représentatif de comment je le voit

    Du coup, que vaut réellement std :: end ? c'est comme size_t je n'ai jamais vraiment compris quelle était ce type si ce n'est qu'il peut (normalement) contenir n'importe quelle taille enfin on s'égare là ..

    Pour reprendre, à la déclaration de ma chaine: str, j'ai un std :: end qui s'est foutu à la fin de ma chaine après le dernier, et quand j'ai utilisé std :: remove, mon std :: end que j'avais jusqu'à présent a était déplacé n'est-ce pas ? sinon comment pouvons nous faire ça

    str.erase(it, std :: end(str));

    et si std :: end ne se tient pas après le dernier char de str comment se fait-il qu'en incrémentant x fois notre itérateur selon la string, on obtient std :: end ?

    Il sont donc forcément aligner en mémoire, non ?

    Du coup, ma question est: si j'ai faux sur toute la ligne, pouvez vous m'expliquer ce qu'il se passe réellement svp ?

    Merci!

    • Partager sur Facebook
    • Partager sur Twitter
      23 avril 2023 à 10:56:40

      Tu l'as testé ton code ? Parce que moi il me sort sous MinGW en C++17 :

      43
      J vux supprimr ds chars dans un stringtring
      J vux supprimr ds chars dans un string
      38

      Ici les caractères de la fin n'ont pas été modifié. Si toi tu as des 'e' c'est que leur valeur est indéfini. Mais il est dit qu'ils ont une valeur non spécifié, même s'il sont toujours déréférençable. 

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        23 avril 2023 à 11:51:56

        Salut,

        Pour std::size_t, c'est utilisé pour mémoriser la taille de quelque chose. Dans un std::size_t, il a donc un nombre. Sais-tu ce que sont: unsigned int, unsigned long et unsigned long long? Si oui, tu sais ce qu'est std::size_t car c'est juste un alias vers celui de ces types qui est assez grand pour contenir la plus grande des tailles qui puisse exister.

        Pour str.end() ou std::end(str), ce sont des fonctions font la même chose, te fournissant ce que vaudra un itérateur dans la chaine qui irait au delà de la fin. La chaine se souvient et peut t'indiquer son début ou sa fin sous la forme d'itérateurs. Après avoir effectué std::remove(begin(str),end(str),'e'), le contenu de la chaine a été modifié, mais justement contrairement a ce que tu écris, l'endroit où sont début et fin n'a pas changé (on le voit sur ton dessin). La fonction te retourne it, lui aussi désigne un endroit dans la chaine, c'est là où commence la zone des caractères à supprimer.

        Quand tu fais str.erase(it,end(str)), c'est à ce moment que la chaine est "repensée", on dit que ses itérateurs sont invalidés. C'est après avoir fait ça que la fin de la chaine n'est plus au même endroit (et attention fin n'est pas un truc nébuleux qui serait à la fin, fin c'est un itérateur qui désigne où est la fin.)

        -
        Edité par Dalfab 23 avril 2023 à 11:52:41

        • Partager sur Facebook
        • Partager sur Twitter

        En recherche d'emploi.

        Début container

        × 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