Problème "Déployons la toute puissance des conteneurs"

Le problème exposé dans ce sujet a été résolu.

Bonjour, j’ai tenté de faire l’exercice sur le std::find ici et du coup mon code donne ceci :

#include <iostream>
#include <algorithm>
#include <string>

int main()
{
    std::string const phrase{ "Exemple illustrant le tutoriel C++ de Zeste de Savoir." };

    auto debutRecherche{ std::begin(phrase) };

    for (int i{ 0 }; i <= std::count(std::begin(phrase), std::end(phrase), ' '); ++i)
    {
        auto placeEspace{ std::find(debutRecherche, std::end(phrase), ' ') };
        auto nombreE{ std::count(debutRecherche, placeEspace, 'e') };
        std::cout << "Dans le " << i+1 << "ieme mot, il y a " << nombreE << " e minuscule(s).\n";
        debutRecherche = placeEspace + 1;
    }

    std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n');

    return 0;
}

sauf que du coup Visual Studio me dit qu’il y a une erreur, mais je ne la comprend pas "cannot seek iterator after end".

Merci

+0 -0

En fait, arrivé au dernier tour de ta boucle, on exécute de nouveau std::find. Or, comme il n’y a plus d’espace à trouver, tu reçois std::end comme valeur de retour. Ensuite, tu assigne placeEspace + 1 à debutRecherche. Donc tu pointe après std::end.

Au tour suivant, le compilateur n’apprécie que moyennement que tu tente d’utiliser std::find avec un itérateur qui n’est plus valide car situé après std::end. D’où l’erreur.

Merci pour ta réponse ;). J’ai essayé de rajouter du coup un if mais du coup il n’aime pas le i == std::count... tu saurais pourquoi ?

#include <iostream>
#include <algorithm>
#include <string>

int main()
{
    std::string const phrase{ "Exemple illustrant le tutoriel C++ de Zeste de Savoir." };

    auto debutRecherche{ std::begin(phrase) };

    for (int i{ 0 }; i <= std::count(std::begin(phrase), std::end(phrase), ' '); ++i)
    {
        auto placeEspace{ std::find(debutRecherche, std::end(phrase), ' ') };
        auto nombreE{ std::count(debutRecherche, placeEspace, 'e') };
        std::cout << "Dans le " << i+1 << "ieme mot, il y a " << nombreE << " e minuscule(s).\n";
        if (i == std::count(std::begin(phrase), std::end(phrase)))
        {
            break;
        }
        debutRecherche = placeEspace + 1;
    }

    std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n');

    return 0;
}

Ça tombe bien dans ce cas :lol: !
Je viens de continuer le cours jusqu’aux exercices et en testant la solution du palindrome proposé j’ai plusieurs problème.
Avec visual studio il m’affiche false pour le premier mot et une pop-up m’affiche :
"string iterators in range are from different containers"
et pour code::blocks il m’affiche false false alors que cela devrait être false true.

+0 -0

Ah, ça, c’est une faute de ma part. :-°

En fait, j’ai fais une faute de phrase dans la ligne suivante.

std::cout << std::equal(std::begin(s2), std::end(s2), std::rbegin(s2), std::rend(s2)) << std::endl;

Il ne s’agit pas de std::rend(s1) mais std::rend(s2). Comme on compare des itérateurs appartenant à deux conteneurs différents, forcément ça coince. Je corrige ça de suite.

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