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 :

Question sur les vectors


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 38
    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
    Par défaut Question sur les vectors
    Salut!

    J'ai besoin de faire une fonction qui crée et initialise aléatoirement un vector d'entiers.
    Je me demandais:
    1)Faut il créer le vector d'une manière particulière pour qu'il reste valide à la sortie de la fonction?
    En C il faut l'allouer dynamiquement pour l'utiliser à la sortie de la fonction, est-ce que pour les vectors on peut se contenter de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<int> vecteur;
    2)Faut il renvoyer un pointeur sur le vector créé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<int>* p_vecteur=&vecteur;
    return p_vecteur;
    ou peut on se contenter de:
    3)Dans ce cas le retour fera il une copie de "vecteur" dans la variable qui recevra le retour de la fonction ou le passage se fera il par référence comme les paramètres de fonction?

    Merci de votre aide.

  2. #2
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    std::vector est un type copiable, donc comme n'importe quel type copiable (un int, un std::string, ...) il peut être renvoyé par valeur par une fonction, et c'est bien une copie qui sera faite.

    Si tu veux éviter la copie, pour des raisons de performances, tu peux toujours passer ton vecteur par référence et simplement le remplir dans la fonction.

  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 : 38
    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
    Par défaut
    Merci de la réponse mais je préfère que la fonction fasse tout.
    Donc il me faut renvoyer un pointeur pour éviter la copie?

  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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Attention, si tu crées ton vecteur dans la fonction comme une variable locale, prendre un vecteur sur lui ne sert à rien car la variable est détruite à la sortie de la fonction.
    comme Laurent le dit si bien, soit tu retournes par valeur, soit tu passes en argument par référence le vecteur à remplir.

  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 : 38
    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
    Par défaut
    OK, donc j'en revient à la première question:
    comment le créer afin qu'il reste exploitable à la sortie de la fonction?
    Comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<int>* p=new vector<int> (10);
    return p;
    ?

  6. #6
    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 : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    2 solutions - on ne fait pas trop de pointeur sur un vecteur -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::vector<int> maFonction()
    {
      std::vector<int> monVecteur;
    /// Mon code
      return monVecteur;
    }
    Auquel cas le vecteur sera créé puis copié dans le nouveau vecteur dans la fonction appelante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void maFonction(std::<int>& monVecteur)
    {
    /// Mon code
    }
     
    void fonctionAppelante()
    {
      std::vector<int> vecteur;
      maFonction(vecteur);
    /// Le reste du code
    }

  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 : 38
    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
    Par défaut
    Oui mais:
    -je veux éviter la recopie à la sortie de la fonction;
    -la fonction doit tout faire:créer et initialiser le vector.

    Donc est-ce que la création avec "new" le rend exploitable à la sortie au travers du pointeur?

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

Discussions similaires

  1. Question sur les Vector
    Par lazins dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 03/10/2008, 09h07
  2. question sur les listes/set/vector
    Par deubelte dans le forum SL & STL
    Réponses: 11
    Dernier message: 04/01/2007, 20h41
  3. question sur les listes/set/vector
    Par deubelte dans le forum SL & STL
    Réponses: 16
    Dernier message: 28/12/2006, 20h17
  4. [debutant STL] question sur les vectors
    Par killerjeff dans le forum SL & STL
    Réponses: 13
    Dernier message: 19/08/2004, 17h32
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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