Je ne comprend pas cette partie…

Aidez moi svp

a marqué ce sujet comme résolu.

Oui, probablement, mais sans plus d’information, on risque de répéter le tutoriel. Il nous faudrait une question, même simple, pour orienter l’explication. A partir d’où est-ce que tu ne comprends pas ?

Par exemple "c’est quoi un conteneur ?", ou "à quoi ça sert concrètement un itérateur ?", pour qu’on sache si il faut expliquer les concepts, ou si c’est une autre section plus loin qui pose problème

Je comprend que pour array et vector c’est les crochet et comment les utiliser, sa je comprend. Ce que je ne comprend rien c’est toute cette partie, seul chose que j’ai compris c’est que pour std::lists les crochet ne fonctionne pas mais tout le reste de cette page je ne comprend pas. Ce qu’edt begin quand l’utiliser pareil pour ends ou pour déclarer une iteration etcc vraiment cette page m’est incompréhensible pareil pour les algorithmes etcc je comprend pas

+0 -0

Salut.

Quand tu dis « c’est les crochets et comment les utiliser », est-ce qu’on est d’accord pour reformuler de la façon suivante : « pour array et vector, on peut indexer les éléments et y accéder facilement » ?

Par conséquent, si tu comprends comment fonctionne une std::list, tu comprendras que tu ne peux pas indexer un élément contenu dedans et que, pour parcourir un std::list, il te faut un itérateur, qui met à disposition les méthodes begin() et end() qui va parcourir cette liste.

Si tu ne comprends pas pourquoi on peut utiliser une liste à la place d’un tableau selon les cas, c’est que tu t’attardes trop sur le langage en lui-même et pas suffisamment sur la résolution de problèmes concrets. Ainsi on peut se questionner sur l’utilité d’étudier ce chapitre à ce stade dans ton apprentissage.

P.S. ça fait 5 ans que je n’ai pas fait de C++ (et je me demande encore dans quel contexte grand public on utilise le C++ avec ses dernières fonctionnalités), donc il est possible que je dise des bêtises. N’hésitez pas à me corriger le cas échéant, même si le fond de mon message reste le même : éviter de trop creuser si c’est pour perdre l’essentiel de vue. :)

+0 -0

Ca ne changera pas forcément grand chose tout le temps, mais il faut savoir qu’il existe une version "bêta" du tutoriel. Elle n’a de bêta que le nom. De temps à autres il pourra y avoir des différences avec la version non bêta: des corrections, des ajouts, etc. Pas sûr qu’il y ait de gros changements sur le chapitre qui te chagrine, mais dans tous les cas, préfère la bêta.

Ton chapitre se trouve là: https://zestedesavoir.com/contenus/beta/822/la-programmation-en-c-moderne/le-debut-du-voyage/deployons-la-toute-puissance-des-conteneurs/

Les listes chaînées, les arbres, ça marchera mieux en dessins pour comprendre la structure: https://hackingcpp.com/cpp/std/containers.html

L’accès indexé, clairement c’est cool. Mais parfois… on ne peut pas. Imagine devoir chercher le 78e mot d’une page. Il n’y a pas de recette savante, où il y aurait une formule magique qui prenne 78 en entrée et qui renvoie un paire de nombres à passer au double décimètre pour savoir où est le 78e mot, quelque soit le livre. Donc pas de méthode magique, il faut un curseur (genre… l'index — nom pas choisi au hasard quand on le retrouve en informatique), on le met sur le 1er mot, et on le déplace ensuite 77 fois pour atteindre le 78e.

Les deux seuls trucs que l’on peut identifier au premier coup d’œil, et donc que l’on connaît, c’est le premier mot (begin en VO), et le … dernier (cela pourrait correspondre au end, mais pas exactement, c’est la position juste après le dernier mot).

À partir de là (i.e. à partir de la paire de positions début et fin) … on peut formaliser tous les algorithmes (au sens véritable, et pas ces bâtardises détournées par les médias, politiques ou autres qui n’y comprennent rien) qui nous font plaisir: compter le nombre de mots, compter le nombre d’adjectifs, d’adverbes, d’occurrences de chaque mot, de les trier, de les transformer, etc.

Et ces algos… en C++ ils sont génériques. Un algo de tri je peux l’appliquer à n’importe quelle séquence d’éléments (dans la mesure où je dispose d’une notion d’ordre entre ces éléments), je peux compter ceux qui respectent une certaine propriété, etc.

Voilà pour les principes. Côté choix syntaxique sur le comment on s’y prend en C++, je te renvoie au tuto. Après si tu as des questions plus précises…

Encore faut-il savoir ce qu’est une liste chaînée ou un arbre. J’ai trouvé le texte suivant au sujet des listes chaînées:

C++ List (With Examples).

Dans un std::array ou std::vector, les éléments sont placés dans des positions consécutives en mémoire et sont de longueur égales. Dans une liste chaînée ou dans un arbre, les éléments peuvent être placés n’importe où en mémoire. Il est donc impossible d’y accéder directement en calculant un décalage par rapport au début. Ils faut suivre le chaînage ou les liens pour accéder à un élément. Dans les listes chaînées, on connait où se trouve le début et la fin, tandis que dans les arbres, on ne connait que le début qu’on appelle la racine.

+0 -0

Bonjour, merci à tous pour vos réponses même si je les trouve un peu dure pour un débutant ( je vais essayer de comprendre quand même vos réponse) mais merci vraiment merci de votre aide. Sa montre que zestedesavoir a une bonne communauté pour aider les nouveaux.

je les trouve un peu dure pour un débutant ( je vais essayer de comprendre quand même vos réponse)

Jiks

Je ne saurais faire plus clair que lmghs, mais j’ai l’impression qu’il te manque du vocabulaire technique.
Un index est une donnée qui indique directement un emplacement au sein d’une collection.
un conteneur est une collection de donnée de même type, et plus spécifiquement en C++, implémentant plusieurs fonctions qui permettent aux algorithmes standards de manipuler cette collection. Plusieurs types de conteneurs existent selon la structure que l’on souhaite avoir, impactant les temps de recherche, d’insertion ou encore de retrait d’un élément. Les listes, les vecteurs … sont des exemples de conteneurs, je te laisse consulter le joli lien de lmghs pour visualiser la structure de chacun.
un accès est une opération de lecture ou d’écriture.
une lecture permet de connaitre la valeur d’une variable.
une écriture permet de modifier la valeur d’une variable.
un itérateur (qu’on essaie de t’enseigner dans ce chapitre) est un type de donnée liée à un conteneur, c’est une abstraction qui te permet de naviguer au sein de la collection.
une abstraction est une manière de définir des comportements cohérents vis à vis d’un concept, sans se préoccuper de la manière dont ce comportement est implémenter.
une implémentation est la suite d’opération effectivement exécuté par la machine.

N’hésite pas à poser des questions plus précises et même plus basiques, car tes réactions laissent penser qu’il te manque des bases qui ne sont peut-être pas celles de ce chapitre.

+0 -0

Petite précision. L'index physique (le doigt quoi), que j’ai utilisé dans ma métaphore précédente, s’apparente à un itérateur: c’est un machin qui permet de désigner une chose parmi un ensemble de choses, un mot parmi les mots d’une page, un pomme parmi les pommes d’une cagette, etc.

L'index en informatique est généralement un nombre qui désigne une position qui offre un accès direct. Surtout quand on parle de tableaux. On a tendance à mélanger les termes index et indice, d’où le i dans for (int i = ..... Et donc c’est assez différent de l’index au bout de notre main.

Oui tu as tout à fait raison, je pense qu’il me manque des bases je m’explique… J’ai voulu commencer la programmation et donc le c++ directement (un langage un peu compliqué pour un début d’après ce que j’ai vu mais bon je pense pas que c’est grave de commencer par ce langage des le debut (c’est que mon point de vue)). J’ai directement commencer le cours sur le c++ moderne sur zestedesavoir donc c’est possible qu’il me manque de bases

+0 -0

J’ai directement commencer le cours sur le c++ moderne sur zestedesavoir donc c’est possible qu’il me manque de bases

Jiks

C’est un cours qui veut apprendre depuis les bases, s’il atteint ses objectifs, pas de soucis à commencer directement par là. Il y a juste dans l’intro une recommandation d’avoir lu auparavant le cours Les bases de la programmation qui peut te servir.
Si, malgré que tu aies tout lu sérieusement, tu ne parviens pas à comprendre, c’est que soit il y a eu un problème de compréhension, soit ça peut aussi être un problème de pédagogie du cours. Dans un cas comme dans l’autre, c’est très bien que tu viennes poser des questions sur le forum, car d’une part on peut répondre à tes questions et résoudre les problèmes de compréhension et d’autre part si on détecte un soucis de pédagogie on peut essayer d’apporter des corrections au cours.

+0 -0

Il y a des bases que ce cours ne fera pas vraiment travailler comme les différentes structures de données. Les complexités des opérations associées, etc.

A ce point (chapitre dans le cours), je t’invite à essayer de résoudre les exercices proposés sur des sites comme france-ioi, mais avec une contrainte: force toi à employer la version moderne du C++. En effet, les corrections proposées sont du C mal porté au C++. Elles présentent des failles que l’approche moderne de l’enseignement du C++ cherche à corriger.

Vois ça dans l’autre sens, peut être qu’il manque une introduction à cette partie du cours. Le cours commence par

Vous débutez complètement et n’avez qu’une vague idée de ce que peut bien être la programmation ? On vous a dit d’en apprendre plus sur le C++ ? Alors ce tutoriel est fait pour vous.

Donc il est fait pour toi, et si tu a du mal avec une partie, c’est une bonne indication pour les auteurs que la partie peut être améliorée. Et trouver la formulation qui t’aidera peut aider à améliorer le tuto.

Je proposais dans ma réponse hier des questions sur le début de la partie, tu m’as répondu que tu avais compris pour array et vector, mais pas pour le reste. Une chose qui ne me semble pas évidente en lisant le cours, c’est: quel problème cherche-t-on à résoudre ? Pourquoi est ce qu’on veut faire autre chose que des vector ?

Prenons l’exemple d’un dictionnaire, c’est une centaine de milliers de mots, avec leurs définitions. On peut les mettre dans un vector, mais le Français est une langue vivante, assez souvent de nouveaux mots apparaissent. Avec un vector, il faut décaler les milliers de mots suivants de une position, puis ajouter le mot et ses définitions. Ou alors ajouter le mot à la fin, mais dans ce cas les mots ne sont plus dans l’ordre alphabétique, et c’est très embêtant pour rechercher les définitions d’un mot.

Pour régler le problème de l’insertion, on a inventé les listes chaînées, qu’on appelle simplement list, mais elles ont un problème: on ne sait pas rechercher facilement un mot dedans. Je ne vais pas expliquer pourquoi ici, mais on a inventé d’autres façons un peu plus compliquées de ranger les choses pour pouvoir facilement ajouter des nouveaux mots, tout en étant de chercher rapidement un mot. Dans mon cas du dictionnaire, en C++ il y en a une qui s’appelle map, qui ressemble à celui qui s’appelle dictionary en Python (pas de chance, même des conteneurs identiques n’ont pas forcément le même nom dans différents langages).

Et donc un conteneur, c’est quoi ? C’est un nom générique pour décrire plein de façons de ranger des objets, et dans lesquelles il va être plus ou moins facile d’accéder à un élément, d’en ajouter, d’en retirer, ou en rechercher.

Et maintenant revenons aux itérateurs: si je veux afficher tous les mots de la langue Française, sur un vector, c’est facile, j’en affiche un, je me décale d’un mot, j’affiche le suivant. Sur une list, c’est différent, et sur une map, ça marche encore différemment. Pourtant, tout ce que je veux, c’est écrire chaque mot. Ce serait pratique de pouvoir écrire le même code sans se soucier de savoir comment celui qui a construit le dictionnaire le gère. Et bien un itérateur c’est ça: peut importe comment un dictionnaire est implémenté, je veux pouvoir prendre le premier mot, en faire ce que je veux (par exemple l’afficher), et passer au suivant, sans savoir ce que veut dire en mémoire "passer au suivant", et sans avoir besoin de réécrire mon code parce que le créateur du dictionnaire a décidé de remplacer un vector par une map pour que le code aille plus vite (même si le créateur c’est aussi moi).

Je ne sais pas si ça t’aide à comprendre pourquoi ce chapitre est là, mais c’est vrai qu’il apporte une solution très génériques à des problèmes que tu n’as probablement pas rencontrés, il y a facilement de quoi être perdu.

Merci a tous de vos réponse. Je vais essayer de passer ce chapitre même si je ne comprend pas tout on verra si sa me gêne par la suite xD je redemanderai de l’aide sur le forum si j’ai d’autre question. Savez vous ou je peux tester mes connaissance et faire des exercices sur quel site? Pour savoir si j’ai bien compris chaque chose que j’apprend sur ce tuto de c++?Merci.

J’ai aussi vu qu’avoir un mentor quand on apprend le c++ est mieux? Cela est t(il vrai? car franchement dans mon entourage personne ne connaît c++ donc est-ce grave si on en a pas?

PS: Désolé de mettre un peu de temps à repondre à chaque fois mais bon avec le travail c’est compliqué parfois d’avoir le temps.

+0 -0

J’ai aussi vu qu’avoir un mentor quand on apprend le c++ est mieux? Cela est t(il vrai? car franchement dans mon entourage personne ne connaît c++ donc est-ce grave si on en a pas?

Jiks

Globalement, si tu poses tes questions ici ou sur discord, tu auras pleins de gens expérimentés qui font te répondre et t’aider. Un mentor peut être interessant, mais pour la motivation ou la méthodologie d’apprentissage, plus que pour les questions techniques sur le C++.

+0 -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