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 ?
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.
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
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.
En recherche d'emploi.