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 :

référence à un vector


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Par défaut référence à un vector
    Bonjour,

    j'ai lu quelques postes à ce sujet mais je n'y ai pas trouvé les réponses que j'attendais.
    mon problème est que j'ai fait un programme douloureusement long
    alors jme suis dit qu'il y avait surement un problème, d'ou mon interet pour la question de recopie des vectors.

    dans les differents postes que j'ai lu, ça parlait surtout de mettre une reference à un vector comme variable d'entrée d'une fonction.

    moi au contraire j'ai plusieurs fonctions qui renvoient des vectors, et d'autres fonctions qui utilisents des valurs de ces vectors.

    exemple :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    vector<double> C1()
    {
      string line;
      ifstream myfile ("test2.txt");
     vector<double> coord;
     
      if (myfile.is_open())
      {
     
         int i=0;
     
        while ( getline (myfile,line))
          {
     
          stringstream ss(line);
     
    	double nombre1;
        double nombre2;
    	double nombre3;
    	char   sep;
     
     
    	while(ss >> nombre1 >> sep >> nombre2 >> sep >> nombre3)
    	    {
    		coord.push_back(nombre1);
    	    }
     
         ++i;
     
          }
     
        myfile.close();
      }
     
      else cout << "Unable to open file"; 
       return coord;
    }
    -> fonction qui cree un vector

    dans mes autres fonctions, j'utilise c1()[i] pour appeler i+1 ème valeur de mon vector.

    vaut-il mieux utiliser une reference? et si oui , comment faire ? ma fonction doit elle renvoyer une reference plutot que le vector, ou dois-je par la suite appeler une reference plutot que le vector?

    merci pour vos reponses!

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    tu peux faire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void C1( vector< double > & coord )
    {
     // remplit ton vector
    }
     
    int main()
    {
        vector< double > coord;
        C1( coord );
    }
    Sinon pour ton ifstream, tu n'as pas à appeler close(), ce serait fait automatiquement à la fin du scope.

  3. #3
    Membre éprouvé
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Par défaut
    Avec cette fonction, utiliser une référence ferait, si tu as de la chance, planter ton application. Pourquoi ? Car tu utilises une variable "morte" : renseigne toi sur la durée de vie des variables et sur les blocs d'instructions.

    Ce qu'il faudrait faire pour optimiser ton application c'est de créer une seule fois ce vecteur ( et éventuellement le recréer si le fichier était modifié ) . Càd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const vector<double>& vc1(C1());
    // ou
    vector<double> vc1(C1()); // s'il doit être modifié par la suite.
    Dans d'autre situation, si tu veux éviter la recopie inutile de vector tu peux faire qqch comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void f(std::vector<int>& ret) {
      // modification de ret.
      // pas de return.
    }
    ...
    void g(void) {
      std::vector<int> vi; f(vi);
    }
    PS : tu devrais utiliser les exceptions dans C1 à mon avis ( quand le fichier ne peut être lu ) .

  4. #4
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Par défaut
    effectivement mon vector n'est plus modifié par la suite donc je peux utiliser const.
    mais j'ai pas compris comment je devais l'écrire? dans le prototype de ma fonction?

  5. #5
    Membre éprouvé
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Par défaut
    Non, dans le type de l'objet qui récupère le vecteur. Comme ma première ligne de code ci-dessus.

  6. #6
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Par défaut
    j'ai fait ce que Nikko34 suggérait. c'est désormais très rapide (2s au lieu de 50s ).
    mais je me demande si on ne paut pas l'améliorer encore car j'ai deux fonctions au debut desquelles je rappelle les vectors.
    en gros estce que je ne pourrai pas les creer une seule fois, en vector globaux?

  7. #7
    Membre éprouvé
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Par défaut
    Disons que tout est possible, mais que généralement les variables globales montre un problème de conception.

Discussions similaires

  1. itérer sur une référence constante de vector
    Par manonoc dans le forum SL & STL
    Réponses: 1
    Dernier message: 17/08/2008, 12h50
  2. Retourner une référence sur un std::vector
    Par Rodrigue dans le forum C++
    Réponses: 12
    Dernier message: 13/10/2007, 16h30
  3. attribut référence sur un vector
    Par youhil dans le forum SL & STL
    Réponses: 2
    Dernier message: 28/05/2006, 20h27
  4. Problème avec vector par référence
    Par vdumont dans le forum SL & STL
    Réponses: 11
    Dernier message: 09/05/2006, 08h25
  5. Réponses: 8
    Dernier message: 26/08/2004, 18h59

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