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 :

Comment implémenter une class iterator dans un Deque


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 7
    Par défaut Comment implémenter une class iterator dans un Deque
    Bonjour :)
    J'essaye actuellement d'implementer moi-même un Deque (à mon niveau, avec une simple structure et une class) Cependant je bloque au niveau des itérator, j'aimerais les definir aussi moi-même (une simple class) mais je ne sais pas comment ils sont implémentés (le peu de code que j'ai pu trouver (STL) est incompréhensible pour moi)
    Alors j'ai fait ça, j'aimerais avoir votre avis là-dessus.
    Car avec un simple pointeur comme j'ai pu le faire je n'arrive pas à implémenter les opérator ++ -- etc..

    Nom : 2019-05-06 19_30_06-C__Users_COURS_Desktop_INFO0402_PROJET_deque.h - Notepad++.jpg
Affichages : 1009
Taille : 104,2 Ko

    Je voulais donc votre avis, vos idées, savoir si je peux implémenter mon iterator de cette facon avec 1 seul pointeur ou si je me trompe complètement et qu'il manque des choses dans ma class

    Merci d'avance :)

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Pourrais tu, au lieu de nous fournir une impression écran de ton code, nous le fournir sous la forme d'un copier / coller, en utilisant la balise [ CODE ] ... le code [ / CODE ] (sans tous les espaces entre les crochets), que tu obtiendras en cliquant sur le bouton # qui se trouve au dessus, à droite de la zone d'édition

    Cela nous simplifierait énormément la vie, car nous pourrions alors faire nous aussi un copier collé dans notre éditeur de texte préféré, et lancer la compilation afin de voir les éventuels problèmes qui n'apparaissent peut-être pas forcément à première vue

    Ceci étant dit, un itérateur est une classe qui présentera une "certaine interface", typiquement, dans le cas d'un deque, composée
    1. d'un opérateur ++ permettant de passer à "l'élément suivant"
    2. d'un opérateur -- permettant de passer à "l'élément précédant"
    3. d'un opérateur == permettant de comparer deux itérateurs (pour savoir s'ils donnent accès au même élément)
    4. d'un opérateur != permettant de comparer deuxitérateurs (pour savoir s'ils donnent accès à des éléments différents)
    5. d'un opérateur *, qui permet de récupérer l'élément itéré sous la forme de T & value = *iterateur;, modulo la constance imposée ou non
    6. d'un opérateur ->, qui permet de récupérer l'élément itéré sous la forme de iterateur->someMember;, modulo la constance imposée ou non

    Et dont le but est de cacher à l'utilisateur (de ta deque, en l'occurrence) la structure interne que la collection (ta deque) utilise pour représenter les différents éléments qu'elle contient; le tout en... utilisant justement la même structure interne (mais cachée à l'utilisateur) que ta collection.

    Je ne vais pas te fournir le code "tout fait", car ce serait trop facile, mais, en gros, tu devrais définir une classe (imbriquée, dans l'accessibilité publique) qui serait proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    class Iterator{
    public:
        Iterator operator++(){
            /* renvoi un itérateur sur l'élément suivant */
        }
        Iterator operator--(){
            /* renvoi un itérateur sur l'élément précédant */
       }
       bool operator == (Iterator const & other) const{
           /* renvoi true si les deux itérateur donnent accès au meme élément */
       }
       bool operator != (Iterator const & other) const{
           return ! *this==other;
       }
       T & operator *(){
            /* Renvoie une référence sur la donnée de type T */
        }
        T * operator ->(){
            renvoie un pointeur sur la donnée de type T
        }
    protected:
        friend class Deque<T>; // seule la classe Deque et la classe Iterator sont en mesure de créer un nouvel itérateur
        Deque(Node<T> * node = nullptr):node_{node}{
        }
    private:
        Node * node_;
    }
    Et, par la suite, tu pourras alors ajouter à ta classe Deque une fonction begin(), qui renvoie un itérateur sur le premier élément de la liste, et une fonction end() qui renvoie un itérateur sur ... ce qui suit le dernier élément de la liste (typiquement : sur nullptr)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 7
    Par défaut
    Merci pour ta réponse, je vais essayer de modifier ma classe et la poster
    J'ai pu comprendre l'idée des itérators, cependant je pense me tromper sur ses attributs, car c'est pour moi un simple pointeur qui pointe vers l’élément d'une cellule non?
    Je peux donc pas avoir d'accès aux autres cellules, est ce que sans me donner le code tu aurais une idée de ce qu'il contient en terme d'attribut ? Ou des informations qui pourrait me donner une idée de sa structure
    Car les informations que j'ai pu avoir sont trop complexe pour moi et traitent d'allocators (chose que je ne connais pas car j'essaye de faire ça modestement avec mon niveau)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Un itérateur c'est un genre de pointeur vers un élément de la collection.
    Mais son intérêt est surtout de pouvoir passer d'un élément à l'autre.
    Sinon ça s'appelle un pointeur ou une référence, et on se serait pas embêté à créer les itérateurs.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 7
    Par défaut
    Je devrais donc avoir un pointeur qui pointe sur un Noeud ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par Flexxi Voir le message
    Je devrais donc avoir un pointeur qui pointe sur un Noeud ?
    Oui. L'itérateur contient bien un pointeur sur un Noeud.
    D'où incrémenter l'itérateur revient tout simplement à incrémenter ce pointeur.
    Par contre déréférencer l'itérateur, revient à accéder à element
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        T& operator*()const {
            return noeud_courant->element;
        }

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/11/2010, 11h30
  2. Réponses: 8
    Dernier message: 02/11/2010, 16h24
  3. Réponses: 1
    Dernier message: 29/08/2010, 22h50
  4. comment appeler une classe java dans une page jsp?
    Par limalima dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 21/11/2008, 22h59
  5. Comment utiliser une classe Java dans une appli PB ?
    Par bobychezA56 dans le forum Powerbuilder
    Réponses: 0
    Dernier message: 09/04/2008, 18h07

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