IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

le type auto


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Octobre 2003
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 200
    Par défaut le type auto
    Bonjour.

    Suivant les recommandations de Luc, j'ai trouvé dans le cours C++ de Zeste de savoir le bout de code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
      std::string const ma_chaine {"rien ne sert de courrir, il faut partir a point"};
      auto iter_debut_mot {std::begin(ma_chaine)};
    ...
    c'est dans le main, et il n'y a pas "using namespace std;".

    Il est expliqué plus haut dans le tuto qu'avec auto, le compilateur est capable de déterminer le type de iter_debut_mot.
    D'accord, mais moi, je ne sais pas le déduire.

    Quelqu'un pourrait-il me dire quel est le type de iter_debut_mot et comment je dois le déclarer si je ne veux pas utiliser "auto" ?
    C'est juste pour ma culture, je n'ai pas de problème de compilation ou d'exécution.

    Merci d'avance de votre aide.

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 322
    Par défaut
    Ici, ça sera`std::string::const_iterator` -- tu reprends le type du conteneur, et rajoute `::` plus `iterator` (si tu veux (et peux!! -> pas le cas ici à cause du `const`) permettre la modification via cet itérateur), ou `const_iterator` (si la modification ne sera pas permise)

    Ce n'est pas des plus utiles. Pas des plus compliqués non -- attends les `std::map<std::string, std::vector<std::string>>::const_iterator`.

    La première raison d'être d'`auto`, c'est justement pour simplifier l'écriture de ces itérateurs.

    PS: mon environnement de dev (gvim ultra-configuré) me permet un clic droit pour inspecter le type ou afficher le type des diverses variables. N'importe quel VSCode (configuré avec clangd derrière le LSP) en permettra autant.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 617
    Par défaut
    (Edit : crosspost avec Luc le temps de rédiger ce message)

    Bonjour,

    Effectivement, ce n'est pas simple du tout (même si, comme souvent et surtout en C++, le concept devient relativement clair une fois qu'on a compris l'idée générale).

    Réponse courte :

    Dans le cas qui t'intéresse, le type est std::basic_string<char>::iterator (et donc std::string::iterator).

    Réponse un peu plus longue :

    Les itérateurs au sens large sont un pattern qui peut s'appliquer à n'importe quel objet itérable, c'est-à-dire que l'on peut parcourir au moins en passant d'un élément au suivant. Donc, ça peut être un tableau, une chaîne de caractère, etc. mais ça peut être également le resultset d'une requête SQL en cours d'exécution, par exemple. Le fait de n'avoir besoin que d'itérer dessus te dispense d'avoir à récupérer et charger en mémoire le jeu de données entier avant de commencer à le traiter et tu peux laisser le serveur te le distiller au compte-goutte si ça l'arrange.

    Pour savoir où on en est, on utilise un objet spécifique qui conserve les méta-données nécessaires. Sur un tableau, un simple pointeur suffit, comme en langage C et c'est pour cela qu'on le mappe souvent sur les mêmes opérateurs (« * » unaire, de déréférencement).

    Étant donné que cet objet est spécifique, à chaque fois, à celui sur lequel il itère, il est bien souvent défini comme sous classe de l'objet concerné. Donc ici (en très simplifié) :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class string
    {
        public:
     
        class iterator
        {}
     
        …
    }

    Donc ici, on définit en une seule fois le type string et son sous-type string::iterator.

    C'est ce qui se passe avec std::string, à ceci près que celle-ci est elle-même dérivée de std::basic_string<>, qui est une grosse classe template générique permettant de définir des chaînes d'à peu près n'importe quels types (caractères ou autres). std::string est en fait un alias de type sur std::basic_string<char>, parce que char est le format de caractère par défaut en vigueur en C et C++.

    À présent, en dehors des types natifs, sont considérés itérables (par convention) les objets qui proposent au moins les fonctions-membres begin() et end(). L'une comme l'autre doivent renvoyer un itérateur (de même type dans les deux cas), l'un référençant le premier élément, l'autre situé exactement un pas après le dernier élément, ce afin que l'on puisse terminer la boucle lorsque l'itérateur courant est égal à celui renvoyé par end().

    std::begin() et std::end, enfin, sont des fonctions template unifiées définies au niveau global et qui te permettent d'obtenir l'itérateur de n'importe quel objet déjà instancié s'il en propose et qu'il implémente les mêmes méthodes. Elle sont décrites ici : https://en.cppreference.com/cpp/iterator/begin

    On voit que leur prototype exige qu'il s'agisse d'une fonction qui admette en argument un type générique C et qui renvoie une donnée dont le type est celui de C.begin() (ce qui impose qu'elle soit implémentée).

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 406
    Par défaut
    Le type est `basic_string<char, char_traits<char>, allocator<char>>::__wrap_iter<allocator_traits<allocator<char>>::pointer>`.

    Les 2 messages précédents montrent justement pourquoi c'est mieux d'utiliser `auto`.

    > ça sera`std::string::const_iterator`

    > et donc std::string::iterator

    Ce qui compte, c'est le concept. Pas le type exact.

  5. #5
    Membre confirmé

    Inscrit en
    Octobre 2003
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 200
    Par défaut
    Merci à vous 3 pour ces réponses très détaillées.

    j'avais essayé std::string::iterator par ce que c'est ce qui me semblait le plus logique au vu de ce que j'ai compris.
    Mais comme ça ne fonctionnait pas, je me suis tourné vers vous.
    C'est bête, il ne manquait pas grand'chose

    Au vu de vos explications, je comprends bien l'intérêt de auto. Mais pour pouvoir bien l'utiliser, j'ai besoin de savoir "ce qui se passe en coulisse".

    Luc, je travaille avec codeblocks sous win11. Je vais tâcher de mettre en oeuvre ce dont tu parles mais ce n'est pas gagné...

    Encore Merci à vous 3.

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 322
    Par défaut
    C::B était pour moi un outil du passé. Visiblement il a un serveur LSP, il faut lui installer clangd en client du coup: https://wiki.codeblocks.org/index.php/CB_Clangd_Client

    Et comme je disais, ta chaine est non modifiable => l'itérateur ne peut pas autoriser la modification sur la chaine => ça doit se répercuter dans le type.

    A force de relectures du tuto puis de la version papier, j'avoue que je ne sais plus exactement, mais il me semble que ces choses seront abordées plus tard j'imagine.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 96
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 771
    Par défaut
    Salut,

    Code::blocks est à la fois simple et léger, personnellement, j'aime bien.

    Après, pour qui a besoin de connaître le type d'un objet, et ce, quel que soit l'EDI, il lui suffit de forcer une erreur de conversion.
    Ici, par exemple, en remplaçant "auto" par "int", la compilation échouera et le message d'erreur contiendra l'information recherchée.
    D'ailleurs, dans ses essais, il l'avait certainement eue, mais apparemment, sans y prêter attention.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter une clé de type auto-increment
    Par ulysse031 dans le forum SQL
    Réponses: 10
    Dernier message: 16/04/2008, 21h06
  2. Initialiser un champ de type Auto-incrément
    Par amtdev dans le forum Access
    Réponses: 2
    Dernier message: 21/02/2008, 13h21
  3. Réponses: 1
    Dernier message: 25/09/2006, 10h18
  4. [Excel] Macro type auto
    Par tounepistols dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/09/2006, 00h04
  5. colonnes de type auto incremental
    Par Bill_Baroud dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 30/12/2004, 12h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo