Salut les agrumes. C’est mon premier post sur le forum. Je suis donc un vrai bleu. Je suis entrain de faire un exercice du cours c++ moderne. C’est l’exercice string_strim:
…
Le but est de reproduire une fonction qui existe dans de nombreux autres langages, comme C# ou Python, et qui permet de supprimer les espaces, au début et à la fin d’une chaîne de caractères. Cela signifie non seulement les espaces ' ' mais aussi les tabulations '\t' , les retours à la ligne '\n' , etc.
…
Je l’avais déjà fait mais cette fois j’ai un peu changé d’approche. Même si je ne me rappel plus exactement comment j’ai fait la dernière fois. Je sais que la méthode ne m’avait pas trop plus. Un peu verbeuse a mon gout. J’ai donc essayer d’écrire quelque chose d’un plus logique cette fois ci. Le problème c’est que ça a l’air de marcher (c’est pas moins verbeux au final) mais la réponse est un peu accidentelle et je n’arrive pas à la comprendre.
Voici mon code source:
#include <iostream>
#include <algorithm>
using namespace std::literals;
int main(int argc, char const *argv[])
{
std::string chaine { R"&(
Un tas de chose ... voila
.. Evidemment ca ne s'arrete pas la!!
FIN Fin fin. ... !!$ )&" };
auto beginChaine { std::begin( chaine ) };
auto endChaine { std::end( chaine ) };
auto it { std::find_if_not( beginChaine, endChaine, isspace ) };
std::cout << *beginChaine << "...." << *it << "..." << *( endChaine - 1 ) << std::endl;
chaine.erase( std::remove_if( beginChaine, it, isspace ), it );
std::cout << *beginChaine << "...." << *it << "..." << *( endChaine - 1 ) << std::endl;
std::cout << chaine << R"&(----|C'est la fin de la chaine|----)&" << std::endl;
beginChaine = std::begin( chaine );
endChaine = std::end( chaine );
std::reverse( beginChaine, endChaine );
std::cout << chaine << R"&(----|C'est la fin de la chaine|----)&" << std::endl;
beginChaine = std::begin( chaine );
endChaine = std::end( chaine );
it = std::find_if_not( beginChaine, endChaine, isspace );
std::cout << *beginChaine << "...." << *it << "..." << *( endChaine - 1 ) << std::endl;
chaine.erase( std::remove_if( beginChaine, it, isspace ), it );
std::cout << *beginChaine << "...." << *it << "..." << *( endChaine - 1 ) << std::endl;
beginChaine = std::begin( chaine );
endChaine = std::end( chaine );
std::reverse( beginChaine, endChaine );
std::cout << chaine << R"&(----|C'est la fin de la chaine|----)&" << std::endl;
return 0;
}
…
Et la version sans les superflus:
#include <iostream>
#include <algorithm>
using namespace std::literals;
int main(int argc, char const *argv[])
{
std::string chaine { R"&(
Un tas de chose ... voila
.. Evidemment ca ne s'arrete pas la!!
FIN Fin fin. ... !!$ )&" };
auto beginChaine { std::begin( chaine ) };
auto endChaine { std::end( chaine ) };
auto it { std::find_if_not( beginChaine, endChaine, isspace ) };
chaine.erase( std::remove_if( beginChaine, it, isspace ), it );
beginChaine = std::begin( chaine );
endChaine = std::end( chaine );
std::reverse( beginChaine, endChaine );
beginChaine = std::begin( chaine );
endChaine = std::end( chaine );
it = std::find_if_not( beginChaine, endChaine, isspace );
chaine.erase( std::remove_if( beginChaine, it, isspace ), it );
beginChaine = std::begin( chaine );
endChaine = std::end( chaine );
std::reverse( beginChaine, endChaine );
std::cout << chaine << R"&(----|C'est la fin de la chaine|----)&" << std::endl;
return 0;
}
ce que je n’arrive précisément pas à comprendre, c’est que erase(itR, it)
ca a l’air d’effacer à contre sens. C’est bizarre. J’ai l’impression de passer à côté de quelque chose de bête mais je vois pas.
S’il vous plait. Merci !