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 :

Retourner un vecteur


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut Retourner un vecteur
    Salut,

    J'hésite toujours sur la bonne façon de faire quand il faut qu'une méthode renseigne un type élaboré comme une classe ou un vecteur.

    Prenons l'exemple du vecteur :

    Faut-il plutôt faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<int> getMonVecteurInt();
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<int>& getMonVecteurInt();
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void getMonVecteurInt(vector<int>& v);
    ou autre chose ?

    Merci de votre aide.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 65
    Points
    65
    Par défaut
    Salut dans ton cas si tu veux recuperer un vecteur de ton objet vu le nom get Vecteur se sera plutot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vecteur<int> getVecteur(void)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Etant une méthode Get, je renverrai une référence constante vers l'objet du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const vector<int>& getMonVecteurInt();
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getMonVecteurInt(vector<int>& v);
    qui a l'incovéniant d'alourdir le code d'appel mais l'avantage de retourner un enum ou booléen à savoir si le traitement s'est bien passé (dans le cas bien sûtr où il n'y a pas de gestion d'exception)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par juls64
    Salut dans ton cas si tu veux recuperer un vecteur de ton objet vu le nom get Vecteur se sera plutot

    vecteur<int> getVecteur(void)
    Le problème dans ce cas est qu'on passe par le constructeur de Vecteur pour la variable de retour.

  5. #5
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par ep31
    Le problème dans ce cas est qu'on passe par le constructeur de Vecteur pour la variable de retour.
    C'est à dire, si je comprend bien, qu'on se paye une recopie a priori inutile avant de retourner le vecteur... contrairement au retour d'une référence.

  6. #6
    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
    Tu peux résumer ça à deux cas de figure :

    1/ Tu veux récupérer un accès en lecture à ton tableau : dans ce cas renvoyer directement une référence constante vers le tableau peut suffire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const std::vector<int>& GetVector() const
    {
        return vector;
    }
    2/ Tu veux renvoyer à l'appelant un nouveau tableau fraîchement rempli, qui n'a rien à voir avec un tableau que tu stockerais dans ta classe : dans ce cas il vaudra mieux prendre le tableau par référence, et le remplir à l'intérieur de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void FillVector(std::vector<int>& Vector) const
    {
        Vector.clear();
     
        Vector.push_back(5);
        Vector.push_back(24);
        ...
    }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par tnarol
    C'est à dire, si je comprend bien, qu'on se paye une recopie a priori inutile avant de retourner le vecteur... contrairement au retour d'une référence.
    Exactement, lors du return object d'une fonction Get() , l'appel au constructeur de recopie de l'objet copié est appelé pour la varibale de retour. Et comme en général on fait en retour d'un Get() un truc du style toto = instance.Get(), on crée d'abord un objet avec le constructeur de recopie pour ensuite le copier dans la variable de retour avec l'opérateur =

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par tnarol
    C'est à dire, si je comprend bien, qu'on se paye une recopie a priori inutile avant de retourner le vecteur... contrairement au retour d'une référence.
    Le compilateur est en droit d'optimiser les copies quand tu retourne une variable locale.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par ep31
    Exactement, lors du return object d'une fonction Get() , l'appel au constructeur de recopie de l'objet copié est appelé pour la varibale de retour. Et comme en général on fait en retour d'un Get() un truc du style toto = instance.Get(), on crée d'abord un objet avec le constructeur de recopie pour ensuite le copier dans la variable de retour avec l'opérateur =
    Merci, et à Laurent aussi...c'est très clair maintenant.
    Juste une question subsidiaire, je sais que c'est pas top au niveau encapsulation mais quel prototype devrait avoir une méthode que retournerait non pas le vecteur mais un pointeur sur un vecteur qui est membre de ma classe ?

  10. #10
    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
    Juste une question subsidiaire, je sais que c'est pas top au niveau encapsulation mais quel prototype devrait avoir une méthode que retournerait non pas le vecteur mais un pointeur sur un vecteur qui est membre de ma classe ?
    Tu ajoutes une étoile après le type de ton vecteur, comme pour n'importe quel pointeur.
    Mais renvoyer un pointeur sur un vecteur... Disons que dans 99% des cas c'est une erreur

  11. #11
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Laurent Gomila
    Tu ajoutes une étoile après le type de ton vecteur, comme pour n'importe quel pointeur.
    Mais renvoyer un pointeur sur un vecteur... Disons que dans 99% des cas c'est une erreur
    Ben en fait la raison pour laquelle je veux faire ça est que j'ai un très grand nombre d'objets qui doivent tous utiliser le même vecteur. Pour ne pas pénaliser les temps d'instanciation et d'accès qui sont critiques j'ai décidé d'isoler ce vecteur "constant" dans une classe à part et de le référencer par un pointeur (au lieu de le copier à chaque fois dans chaque objet). A la réflexion je pourrais plutôt garder une référence sur la classe et lui demander son vecteur à chaque fois que j'en ai besoin mais avec un léger surcoût d'appel...

  12. #12
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    Par défaut
    t'as qu'a mettre ton getter inline
    besoin de réponses ? demande a un pote

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

Discussions similaires

  1. [Débutant] Fonction reçoit un vecteur et retourne un vecteur
    Par Épanouissement dans le forum MATLAB
    Réponses: 4
    Dernier message: 28/11/2014, 15h42
  2. Retourner le resultat d'un split dans un vecteur
    Par heni86_2003 dans le forum Général Java
    Réponses: 1
    Dernier message: 05/07/2010, 11h33
  3. [Débutant] Retourner un vecteur dans une fonction
    Par kheira dans le forum C++Builder
    Réponses: 3
    Dernier message: 24/03/2010, 14h04
  4. Comment retourner un vecteur dans une fonction ?
    Par petitclem dans le forum C++Builder
    Réponses: 9
    Dernier message: 03/02/2010, 10h24
  5. Réponses: 6
    Dernier message: 28/09/2005, 11h30

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