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 :

Probleme avec parcours de stl::vector


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 46
    Par défaut Probleme avec parcours de stl::vector
    Bonjour,

    Voila, j essaye de parcourir un vecteur en utilisant un iterateur. Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(vector<unsigned int>::iterator it=p->getCode().begin();it !=p->getCode().end();it++)
                   {
                    ShowMessage(IntToStr(p->getCode()[0])); // affichage 1
                    ShowMessage(IntToStr(*it)); // affichage 2
                    ShowMessage(IntToStr(*(p->getCode().begin()))); //affichage 3
                   }
    Mon probleme c est que affichage 1 et 3 sont corrects mais pas l affichage 2, qui me retourne une valeur du genre "98767867" alors que affichage 1 et 2 renvoie la valeur correcte 12.

    Je ne comprends pas.

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    getCode() ne renverrait pas une copie ?
    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
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 46
    Par défaut
    Je ne suis pas sur de comprendre ta question donc je te mets le code de getCode():
    Quelques explications avant.
    Une classe Trame qui n est qu une liste d objets de la classe Info qui eux contiennent une chaine, un vecteur d entier (ce dont on parle ici), ...

    dans ma classe Info, il y a donc cette methode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vector<unsigned int> Info::getCode()
    {
    return code;
    }
    où code est un vector<unsigned int> . Est ce cela renvoyer une copie ?

    Dans la boucle precedente, p est l iterateur de parcours de ma liste de la calsse Trame et pointe donc sur un objet de type Info.

    Voila j espere que j ai ete assez clair ...

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    Citation Envoyé par MDiabolo
    Est ce cela renvoyer une copie ?
    oui.

    pour renvoyer une référence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vector<unsigned int> & Info::getCode()
    {
    return code;
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 46
    Par défaut
    Bon je peux pas tester ici mais des que je rentre ce soir je teste ca ...
    Sinon il vaut donc toujours mieux renvoyer une reference qu une copie ?

    Quelles sont les regles dans ce domaine ?

    En tout cas merci beaucoup. Je vous tiens au courant.

  6. #6
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    Ben une copie déjà ça va prendre du temps pour des gros objets,
    Si tu copie une std::vector de 1000000 éléments ça va prendre du temps.
    Par contre si tu renvoie une référence, l'objet ne sera pas copié, tu passera l'objet lui même.
    De plus si tu modifie la copie, ça ne modifiera pas l'objet initiale :

    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
    #include <iostream>
    void Substract(int i, int j)
    {
        std::cout << i << std::endl;
        i -= j;
        std::cout << i << std::endl;
    }
    int main(void)
    {
        int i = 10;
        std::cout << i << std::endl;
        Substract(i, 5);
        std::cout << i << std::endl;
        return 0;
    }
    normalement ce code va te retourner :
    car le i de la fonction substract va copier i et tu va travailler avec la copie de i, pas avec i.
    par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void Substract(int& i, const int& j)
    {
        std::cout << i << std::endl;
        i -= j;
        std::cout << i << std::endl;
    }
    va te retourner
    car cette fois Substract travail sur i lui même, le i du main et le i de Substract ne font qu'un...

  7. #7
    Membre chevronné Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Par défaut
    donc ta fonction GetCode qui retourne un std::vector<unsigned int> copie le std::vector<unsigned int> qui est dans ta class....
    le fait de retourner un std::vector<unsigned int>& va retourner non pas une copie de l'élément de ta class mais l'élément lui même...
    par conséquent, quand tu appel GetCode dans ta boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (std::vector<unsigned int>::iterator pi = p->GetCode().begin(); pi != p->GetCode().end(); ++pi)
    {
        /**/
    }
    le premier appel à GetCode cré un vector et copie le vector de ta class dedans.
    Le second égallement... Donc tu as des problèmes, car l'itérateur que tu fais varier n'est pas dans le même contener que la limite...
    Je crois même qu'en debug, ton code va créer un vector, copier ton vector, pour faire le test != de end(), puis détruire ce vector à la fin du test, et ce pour chaque test, donc autant de fois que la taille de ton vector...
    Les compilateurs optimisent cela en release, il stocke la valeur si elle ne change pas; j'ai testé.

    Une petite remarque :
    Pourquoi utilise tu le vector comme une liste ?
    L'intérêt du vector c'est d'avoir accès à n'importe quel élément grâce à son index.
    L'intérêt de la liste c'est de la parcourir en sautant d'un élément à son suivant...

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Citation Envoyé par MDiabolo
    Sinon il vaut donc toujours mieux renvoyer une reference qu une copie ?

    Quelles sont les regles dans ce domaine ?
    Quand je le peux, je renvoie des références constantes.
    Des copies quand la donnée est générée dans la fonction. Mais là, il ne faut pas écrire ce que tu as écrit. Extraire (directement) des itérateurs d'un temporaire non nommé n'a aucun autre intérêt qu'être une source de bugs. Cf la réponse de Rafy.

    @ Rafy, utiliser un vecteur n'implique pas nécessairement de ne pas itérer avec un itérateur. Il y a quantité d'autres intérêts à avoir des vecteurs (occupation mémoire, contiguité des éléments, ...) et pourtant ils se parcourrent très bien avec des itérateurs -- sauf cas particuliers.
    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...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 46
    Par défaut
    Merci pour toutes vos reponses,

    bon la parie qui posait probleme marche mais maintenant je suis confus avec ces references et ces pointeurs.

    La premiere est pourquoi si je veux renvoyer une reference je dois ecrire ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector<unsigned int> & Info::getCode()
    {
    return code;
    }
    et pas ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector<unsigned int> & Info::getCode()
    {
    return &code;
    }
    De plus quelle est la difference entre passer une reference (&) et passer un pointeur (*) en pratique ? Dans quel cas l un, dans quel cas l autre ?. Je sais c est dans la faq, mais apres l avoir lu plusieurs fois je fais toujours des erreurs en pratique (bon je me console en me disant que je suis surement pas le seul mais bon...)

  10. #10
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Voire mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<unsigned int> const& getCode() const
    {return m_code;}
    Un accesseur qui renvoie une référence non constante est une faute de goût -- une rupture obscurantiste d'encapsulation en ce qui me concerne.

    La question référence ou pointeur a été reposée il y a moins de 10 jours.
    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...

  11. #11
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    "&var" renvoie l'adresse à laquelle se trouve l'objet

    une référence c'est comme un pointeur mais c'est transparent pour le programmeur. tu continues de coder comme si tu manipulais l'objet lui-même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type & ref = var;
    ref.func(); // équivalent à var.func()
     
    type * ptr = &var;
    ptr->func(); // équivalent à var.func(), notation différente
    pour le reste, voir

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

Discussions similaires

  1. Probleme avec std::vector
    Par dhoorens dans le forum SL & STL
    Réponses: 2
    Dernier message: 12/03/2007, 16h51
  2. Problem avec std::vector
    Par boiteweb dans le forum SL & STL
    Réponses: 5
    Dernier message: 29/04/2006, 12h56
  3. probleme avec la classe vector
    Par elekis dans le forum Langage
    Réponses: 4
    Dernier message: 12/04/2006, 16h25
  4. Probleme avec la STL(vector) avec code C
    Par Benjy dans le forum SL & STL
    Réponses: 12
    Dernier message: 06/04/2006, 12h54
  5. probleme avec vector
    Par venomelektro dans le forum SL & STL
    Réponses: 16
    Dernier message: 16/08/2004, 23h39

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