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

SL & STL C++ Discussion :

Iterateur sur pointeur de vector


Sujet :

SL & STL C++

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Iterateur sur pointeur de vector
    Salut!

    Je fais un prog de tri sur des vector et je me suis embourbé dans l'utilisation de pointeur sur vector.
    Ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::vector<int>* p_vecteur=new std::vector<int>(size);
    std::vector<int>::iterator iterateur;
    int randomValue;
    for(iterateur=p_vecteur->begin();iterateur!=p_vecteur->end();iterateur++){
    randomValue=(int)((float)rand()/RAND_MAX*(max-min+1)+min);
    p_vecteur->push_back(randomValue);
    }
    me crée un vector trop grand, comme si la condition d'arrêt était mauvaise.

    Merci de votre aide.

    PS: à ceux qui diront "les pointeurs sur vector c'est tout pourri" je répond que je vient de m'en apercevoir et que j'aimerais juste comprendre mon erreur.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    c'est à cause du push_back, le fait d'allouer une taille à ton vecteur lui donne déjà une taille prédéterminée, faire push_back dessus rajoute encore des éléments rien à voir avec ton pointeur (même si c'est vrai que c'est pourri )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::vector<int>* p_vecteur=new std::vector<int>(size);
    std::vector<int>::iterator iterateur;
    int randomValue;
    for(iterateur=p_vecteur->begin();iterateur!=p_vecteur->end();iterateur++){
    randomValue=(int)((float)rand()/RAND_MAX*(max-min+1)+min);
    *iterateur = (randomValue);
    }
    au fait, ça sert à rien de parcourir un vector avec un itérateur si tu ne l'utilise pas... c'est même moins efficace qu'avec un indice...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci c'était en effet ça le problème.

    au fait, ça sert à rien de parcourir un vector avec un itérateur si tu ne l'utilise pas... c'est même moins efficace qu'avec un indice...
    Dans quel cas les itérateurs sont ils essentiels?
    Pourquoi un indice n'est pas bon dans tous les cas?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Surtout qu'après un push_back, on est pas sûr de la validité de l'itérateur !

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Miles
    Surtout qu'après un push_back, on est pas sûr de la validité de l'itérateur !
    En effet.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Si tu veux les itérateurs c'est des pointeurs encapsulés dans une classe...

    ils permettent de ne pas avoir à calculer l'adresse de la ième case du tableau quand tu veux y avoir accès de manière interactive...

    exemple :
    ici il vaut mieux ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<int> v(600);
    for(vector<int>::iterator it = v.begin(); it != v.end(); ++it) *it = rand();
    que ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<int> v(600);
    for(unsigned i = 0; i < v.size(); ++i) v[i] = rand();
    parce que dans le second cas, à chaque que tu fais v[i], il te faut faire appelle à l'opérateur de la classe, calculer l'adresse de la ième case, déréférencer, renvoyer la référence...

    alors qu'avec l'itérateur, il suffit d'appelrr, déréférencer, renvoyer... tu as un accès direct à la variable, pas besoin de calcul...

    cependant, il est possible que tu veuilles faire d'autres opérations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    vector<int> v(600);
    vector<int>::iterator it;
    int S = 0;
    while((it = v.begin()) != v.end())
    {
       S += *it;
       v.erase(it);
    }
    mis à part le fait que ce soit pas très beau... c'est pas le mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    deque<int> v(600);
    int S = 0;
    while(v.size() != 0)
    {
       S += v.front();
       v.pop_front();
    }
    à noter : je ne suis pas sûr que front() et pop_front() existent sur les vector, donc j'ai pris un deque, les deque sont des vector optimisés pour les accès à leurs extrémités... (cf tuto sur la STL ) mais le principe reste le même...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Trés bonne explication.
    Le truc en fait c'est que l'itérateur "suit" le mouvement de recherche sur le vector alors qu'avec "[]" on recommence tout à zéro.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    exactement l'itérateur parcours le tableau pas à pas...
    tandis que l'indice fait à chaque fois un bond depuis le déut
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci beaucoup.
    Je met le tag .
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    NB: ce qu'explique Swoog n'est pas systématique. Cela dépend beaucoup des compilos. A vrai dire, j'en était resté que c'est aujourd'hui la même chose.
    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...

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

Discussions similaires

  1. Petites questions sur un pointeur vers vector
    Par Kaluza dans le forum Débuter
    Réponses: 1
    Dernier message: 08/01/2012, 09h18
  2. Besoin d'aide sur pointeur
    Par SebRs dans le forum C++
    Réponses: 2
    Dernier message: 18/05/2006, 10h21
  3. Réponses: 2
    Dernier message: 24/04/2006, 16h21
  4. pointeur et vector STL
    Par jocker dans le forum SL & STL
    Réponses: 5
    Dernier message: 01/03/2006, 09h16
  5. pointeur sur pointeur
    Par gaut dans le forum C
    Réponses: 3
    Dernier message: 01/11/2005, 21h30

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