questionnement sur un exercice dans le tuto c++

utilité de std::distance dans le chapitre « Déployons la toute puissance des conteneurs ». (La programmation en C++ moderne)

a marqué ce sujet comme résolu.

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. :euh: (éviter des bugs?)

D’avance merci !

Je me souviens pas de cette partie du code dans le cours, je sais pas tres bien pourquoi on a laisser passer ca. Mais a priori, oui, ca sera a rien d’utiliser distance dans ce cas. A priori, on aura toujours : debut + std::distance(debut, iterateur) == iterator.

L’intérêt de distance, c’est que c’est indépendant du type de collection. Si tu écris par exemple iterateur - début, c’est valide uniquement pour les conteneurs avec les données contigues en mémoire (par exemple vector). Alors que distance(debut, iterateur) est valide aussi avec list par exemple. Dans le cas de string, c’est forcément contigu.

+3 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte