Bonjour,
Je suis un ancien du C qui refuse de ce conformer à C++ .NET de Microsh.t et qui préfère la méthode dure à la Linux Slackware!!! Donc compilateur g++ et éditeur de texte (Code::Block dans mon cas).
Je n’ai pas suivis l’évolution du C++11, encore moins la 14 donc vous imaginez que ma connaissance de la STL est Null.
J’ai décidé de m’y remettre sérieusement et j’ai trouvé votre tutoriel https://zestedesavoir.com/tutoriels/822/la-programmation-en-c-moderne
C’est vraiment super, je suis vos exemples, fait des tests et ça fonctionne. Mais il me manque quelque chose à ma compréhension et j’espère que vous allez pouvoir m’aligner.
Aussi, toutes mes questions sont en lien avec ce tuto.
Voici mes questions:
- Je m’interroge sur le "contenu", le type, d’un itérateur. Partout, on indique que l’itérateur est de type auto, mais dans les fait, quel est le type d’un itérateur?
À ma compréhension, un itérateur est un conteneur qui détient un ou des résultat. Donc c’est un array? un array de pointeurs?
//Phrase clé
string const str_Text { "Un exemple de phrase avec plusieurs mots." };
//Création des itérateurs
auto const it_Begin { begin(str_Text) };
cout << *it_Begin << endl;
On m’affiche içi "U" donc j’assume que l’itérateur it_Begin est un pointeur de type char, ou encore mieux, un indice à incrémenter pour l’élément 0 du tableau de char str_Text (str_Text[0])?
cout << *it_Begin << endl;
it_Begin++;
cout << *it_Begin << endl;
Ceci m’affiche U et n. Donc l’itérateur semble bien être un pointeur ou un array de pointeurs.
Mais dans le tuto, il est inscrit:
Grâce aux itérateurs, nous pouvons facilement créer des sous-ensembles à partir d’une collection d’éléments, comme un tableau qui ne contiendrait que les éléments 2 à 5 d’un autre tableau.
Je lis içi (comprend) que les itérateurs peuvent contenir des tableaux de types array? Je suis un peu perdu sur le type. Vous allez me dire "voilà pourquoi utiliser auto" mais une explication serait appréciée s.v.p.
- Toujours dans le même tuto, l’exemple qui compte le nombre de "e" de chaque mot dans une phrase est une vraie source … de questionnement.
Dans l’exemple, on définit un l’itérateur
std::string const phrase { "Exemple illustrant le tutoriel C++ de Zeste de Savoir, mais un peu plus long." };
auto iterateur_espace { std::find(std::begin(phrase), std::end(phrase), ' ') };
Donc, je comprend que la variable iterateur_espace sera un itérateur spécifiquement sur les espaces. Mais non, à ma grande surprise, il faut le redéfinir à chaque fois à partir d’un nouvel indice.
// Tant qu'on est pas à la fin de la phrase.
while (iterateur_espace != std::end(phrase))
{
std::string const mot { iterateur_precedent, iterateur_espace };
auto const total_e { std::count(std::begin(mot), std::end(mot), 'e') };
std::cout << "Dans le mot '" << mot << "', il y a " << total_e << " fois la lettre 'e'." << std::endl;
// On incrémente pour ne pas garder l'espace au début, car iterateur_espace pointe déjà sur un espace.
++iterateur_espace;
// On met à jour notre itérateur de sauvegarde.
iterateur_precedent = iterateur_espace;
// On cherche la première occurrence dans le nouveau sous-ensemble.
iterateur_espace = std::find(iterateur_espace, std::end(phrase), ' ');
Je suis cassé. Pourquoi faut-il redéfinir l’itérateur 'iterateur_espace’, si on l’incrémente de +1 précédemment et qu’en entré de boucle, on définit que cet itérateur pointe sur une recherche des Espaces. Ne devrait-il pas déjà pointer sur le second espace? C’est un itérateur après tout et on le définit comme itération sur les ' '.
J’ai tenté d’expliquer au mieux mes questions, n’hésitez pas à me demander des précisions au besoin, mais là, vous m’avez eu.
Merci de votre aide.