Bonjour à tous,
Je suis actuellement le cours "La programmation en C++ moderne".
Je me questionne sur la correction du dernier exercice du chapitre « Déployons la toute puissance des conteneurs » et de l’utilité de la fonction std::distance.
Voici l’intitulé puis la correction:
Couper une chaîne
Une autre opération courante, et qui est fournie nativement dans d’autres langages comme Python ou C#, consiste à découper une chaîne de caractères selon un caractère donné. Ainsi, si je coupe la chaîne "Salut, ceci est une phrase." en fonction des espaces, j’obtiens en résultat ["Salut,", "ceci", "est", "une", "phrase.].
Le but est donc que vous codiez un algorithme qui permet de faire ça. Vous allez notamment avoir besoin de la fonction std::distance, qui retourne la distance entre deux itérateurs, sous forme d’un nombre entier.
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::string texte { "Voici une phrase que je vais couper." };
char const delimiteur { ' ' };
std::vector<std::string> parties {};
auto debut = std::begin(texte);
auto fin = std::end(texte);
auto iterateur = std::find(debut, fin, delimiteur);
while (iterateur != fin)
{
// Grâce à std::distance, nous obtenons la taille du mot.
std::string mot { debut, debut + std::distance(debut, iterateur) };
parties.push_back(mot);
// +1 pour sauter le délimiteur.
debut = iterateur + 1;
// Et on recommence.
iterateur = std::find(debut, fin, delimiteur);
}
// Ne pas oublier le dernier mot.
std::string mot { debut, debut + std::distance(debut, iterateur) };
parties.push_back(mot);
// On affiche pour vérifier.
for (std::string mot : parties)
{
std::cout << mot << std::endl;
}
return 0;
}
puis, pour alléger un peut le code, j’ai remplacé les lignes 19 et 29 par:
std::string mot { debut, iterateur };
Est cela fonctionne parfaitement ! D’où mon interrogation sur l’utilité de cette fonction dans ce cas précis. (éviter des bugs?)
D’avance merci !