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 :

Problème de compréhension des Iterator


Sujet :

C++

  1. #1
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut Problème de compréhension des Iterator
    Bonsoir tous le monde,

    je travaille actuellement sur la transcription d'un code C++ en java, mais le souci c'est que je ne connais pas le C++ :-(
    Je bloque sur un morceau utilisant des Iterator et j'aurai souhaité que vous m'apportiez vos lumières :

    Code C++ : 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
     
    ...
    typedef typename std::list<Point<d> >::iterator         It;
    ...
     
    template <int d>
    double Miniball<d>::max_excess (It t, It i, It& pivot) const
    {
      ...
      for (It k=t; k!=i; ++k) {
        const double *p = (*k).begin();
        ...
        pivot = k;
        ...
      }
      return max_e;
    }

    Voilà ce que je pense avoir compris :
    - It est un nouveau type qui définit un itérateur sur une liste de points de dimension n. Je peux vous dire que ces points sont juste une classe contenant un tableau de double.
    - En faisant des recherches, j'ai trouvé que dans un itérateur, la fonction begin() renvoie le pointeur sur le premier élément, sauf si celui-ci a été incrémenté par 'MonIterateur.begin()++'.
    - Si T est un itérateur, alors faire T++ permet d'avancer à l'élément suivant.

    Mais je bloque sur la première ligne du for : on incrémente k dans la boucle, mais on prend systématiquement (*k).begin().
    Donc cela veut dire qu'il y a un souci dans ce que je pensais avoir compris.

    Est ce que quelqu'un pourrait m'aider à y voir plus clair ?

    Merci par avance

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    En fait (*k) est un Point<d> donc (*k).begin() est un appel de méthode sur un objet de type Point<d>.
    L'itérateur permet d'itérer (étonnant non ? ) sur une série d'éléments.
    L'opérateur de déréférencement (l'étoile) permet d'accéder à la valeur de l'élément correspondant à la position courante de l'itérateur.

    MAT.

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    En fait (*k) est un Point<d> donc (*k).begin() est un appel de méthode sur un objet de type Point<d>.
    Eurf... merci, j'y étais pas du tout.
    Je pensais que l'itérateur itérait que sur la liste, j'avais pas fait le rapprochement avec le (*k). Pourtant je connais les pointeurs en C... shame on me !!!

    Par contre on est bien d'accord que 'k++' fait avancer l'itérateur !

    Petite question annexe : la comparaison 'k!=i' compare en fait deux éléments des itérateurs i et k. Comme c'est des objets (ici des points), comment cela se passe t-il exactement ? Par adresse ?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Petite question annexe : la comparaison 'k!=i' compare en fait deux éléments des itérateurs i et k. Comme c'est des objets (ici des points), comment cela se passe t-il exactement ? Par adresse ?
    Oui tu peux voir ça comme ça. Deux itérateurs sont considérés égaux s'ils pointent vers le même élément.

    De manière générale si tu connais les pointeurs alors tu as tout compris aux itérateurs : un itérateur a exactement la sémantique d'un pointeur, donc est similaire en terme d'opérateurs, de comportement, etc.

  5. #5
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Je pensais que l'itérateur itérait que sur la liste
    mais c'est le cas, il y a un parcours de la liste

    dans (*k).begin() le begin() s'applique sur un Point, bref il y a homonymie mais par forcément un rapport entre ce begin et celui d'un itérateur, sauf bien-sûr si Point est lui même un itérateur (via typedef ou un héritage)

    Par contre on est bien d'accord que 'k++' fait avancer l'itérateur !
    oui


    la comparaison 'k!=i' compare en fait deux éléments des itérateurs i et k. Comme c'est des objets (ici des points)
    non, k et i étant des itérateurs k!=i compare les deux itérateurs, pas ce qu'ils désignent, et donc pas des points.

    comme il a été dit, un itérateur est une sorte de pointeur 'intelligent' car en fin de liste faire ++ ne fait rien et en début de liste faire -- ne fait rien non plus. Bref ce sont des pointeurs qui ne dépassent pas les bornes

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Merci pour toutes ces explications, j'y vois plus clair.
    Malheureusement, les itérateurs en java sont différents (pointent entre les éléments) et ma transcription ne fonctionne pas :-(
    Je garde le poste ouvert si nécessaire... je marquerai résolu plus tard.

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/03/2009, 12h48
  2. Problème de compréhension des CSocket
    Par olator dans le forum MFC
    Réponses: 4
    Dernier message: 05/11/2008, 09h52
  3. Réponses: 3
    Dernier message: 16/06/2008, 17h15
  4. Réponses: 2
    Dernier message: 14/12/2007, 01h47
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

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