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 :

remplissage d'un vecteur de type vector


Sujet :

C++

  1. #1
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut remplissage d'un vecteur de type vector
    bonjour,
    j'ai besoin de remplire un vecteur de type vector à partir de plusieurs vecteur
    supposant je veux remplire à partir de 2 vecteurs seulement:
    vector<int>v1(5);//vecteur de taille 5
    vector<int>v2(7);//vecteur de taille 7

    et vector<int>v3;//vecteur résultat

    maintenant je veux remplir v3 de la façon suivante
    un entier à partir de V1 puis de V2 puis de V1...
    v3[0]=v1[0];
    v3[1]=v2[0];
    v3[2]=v1[1];
    v3[3]=v2[1];
    ...
    à chaque itération je prends un entier d'un vecteur différent

    j'ai pas su comment faire la boucle(sachant que j'ai plusieurs vecteurs et non pas 2 et de taille différent)
    merci d'avance

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Par défaut
    if(v1.size() < v2.size())
    {
    v3.resize(v1.size())
    }

    else
    {
    v3.resize(v2.size());
    }

    for(unsigned int i = 0; i < v3.size(); i += 2)
    {
    v3[i] = v1[i / 2];
    v3[i + 1] = v2[i / 2];
    }

    J'ai pas tester mais ca devrait marcher.

  3. #3
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    mais non, j'ai bien préciser
    les vecteur n'ont pas la même taille, c'est ça mon problème

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut.

    Tu peux faire ainsi:

    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
    vector<int>* TabVecteurs[nbvecteurs] = {&v1, &v2, ...};
     
    vector <int> vtotal; //le vecteur dans lequel on stocke tout
    vector <int>* global_it; //un itérateur sur le tableau de pointeurs de vecteurs
     
    //On parcoure le tableau de vecteur
    for (global_it = TabVecteurs; global_it != TabVecteurs + nbvecteurs; global_it++)
    {
         vector<int>::iterator it; 
         //et là le vecteur courant
         for (it = global_it->begin(); it != global_it->end(); ++it)
         {
                vtotal.push_back(*it);
         }
    }

  5. #5
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    je crois que vous m'avez mal compris
    le remlissage n'est pas vecteur aprés vecteur

    c'est en fait chaque case de chaque vecteur à part

    voila:
    v3[0]=v1[0];
    v3[1]=v2[0];
    v3[2]=v1[1];
    v3[3]=v2[1];

    et non pas
    v3[0]=v1[0];
    v3[1]=v1[1];
    v3[2]=v2[0];
    v3[3]=v2[1];

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    le code de Nitroreg correspond parfaitement à ta description, non?
    mais faut corriger l'init de v3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(v1.size() < v2.size())
        {
        v3.resize(2*v1.size())
        }
    else
        {
        v3.resize(2*v2.size());
        }

  7. #7
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    je vais essayé ça

  8. #8
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    Désolé j'avais mal compris,

    mais ce n'est pas plus compilqué:

    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
    vector<int>* TabVecteurs[nbvecteurs] = {&v1, &v2, ...};
     
    vector <int> vtotal; //le vecteur dans lequel on stocke tout
    vector <int>* global_it; //un itérateur sur le tableau de pointeurs de vecteurs
     
    //on calcule la taille de vtotal;
    int size = 0;
    int size_max = 0;
    for (global_it = TabVecteurs; global_it != TabVecteurs + nbvecteurs; global_it++)
    {
         size += global_it->size();
         if (size_max < global_it->size())
         {
              size_max = global_it->size();
         }
    }
     
    vtotal.reserve(size);
     
    int i;
     
    for (i = 0; i < size_max; i++)
    {
      //On parcourt le tableau de vecteur
      for (global_it = TabVecteurs; global_it != TabVecteurs + nbvecteurs; global_it++)
      {
         if (i < global_it->size())
         {
              vtotal.push_back((*global_it)[i]);
         }
       }
    }
    Là, sauf erreur de ma part, ça fera ce que tu veux.
    Néanmoins, si les tailles sont très différentes, alors il peut être plus performant d'utiliser une liste qui contient des pointeurs vers les vecteurs, et on efface un pointeur de la liste lorsque l'on a atteint la fin du vecteur correspondant.
    Et pour optimiser les performance, si c'est nécessaie, on peut utiliser un tableau/ (ou liste dans le deuxième cas) d'itérateurs, mais ça rendra le code encore plus imperméable...

    Edit:
    Quelques modifications de code

  9. #9
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    le code de Nitroreg correspond parfaitement à ta description, non?
    mais faut corriger l'init de v3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(v1.size() < v2.size())
        {
        v3.resize(2*v1.size())
        }
    else
        {
        v3.resize(2*v2.size());
        }
    En fait, les vecteurs on des tailles différentes, donc il faut tester à chaque fois si la fin du vecteur n'est pas atteinte, ou trouver un autre moyen.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    En fait, les vecteurs on des tailles différentes, donc il faut tester à chaque fois si la fin du vecteur n'est pas atteinte, ou trouver un autre moyen.
    ???

    Je ne sait pas si il utilisera plus de deux vector et ce qu'il fait après avoir terminé avec le plus petit des vector...

    Ton code est peut etre plus ce qu'il recherche. Juste quelques remarques sur ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<int>* TabVecteurs[nbvecteurs] = {&v1, &v2, ...};
    j'aurais préféré un vector< vector<int>* >

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vtotal.resize(size);
    ...
    vtotal.push_back((*global_it)[i]);
    ton vector aura une taille de 2* size
    Tu voulais peut être plutôt écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vtotal.reserve(size);

  11. #11
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    oui j'utilise plus que 2vecteurs

  12. #12
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    Citation Envoyé par Mongaulois Voir le message
    ???

    Je ne sait pas si il utilisera plus de deux vector et ce qu'il fait après avoir terminé avec le plus petit des vector...
    j'ai pas su comment faire la boucle(sachant que j'ai plusieurs vecteurs et non pas 2 et de taille différent)
    merci d'avance
    Citation Envoyé par Mongaulois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<int>* TabVecteurs[nbvecteurs] = {&v1, &v2, ...};
    j'aurais préféré un vector< vector<int>* >
    Je ne vois pas pourquoi ne pas utiliser un tableau ?(sachant que nbvecteur est une constante)
    Il existe std::tr1::array pour les tableaux de taille fixe.

    Citation Envoyé par Mongaulois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vtotal.resize(size);
    ...
    vtotal.push_back((*global_it)[i]);
    ton vector aura une taille de 2* size
    Tu voulais peut être pluôt ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vtotal.reserve(size);
    Exactement
    J'édite mon précédent code de suite.

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Je ne vois pas pourquoi ne pas utiliser un tableau?
    Il existe std::tr1::array pour les tableaux de taille fixe.
    Juste parce que c'est plutôt du C et qu'il développe en C++.
    De plus rien ne dit que nbvecteurs sera fixe. Mais j'ai peut être zappé encore une explication

  14. #14
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Juste parce que c'est plutôt du C et qu'il développe en C++.
    De plus rien ne dit que nbvecteurs sera fixe. Mais j'ai peut être zappé encore une explication
    C'est vrai qu'il vaut mieux utiliser la STL si nbvecteurs n'est pas fixe.
    J'ai fait cette supposition vu que le code fourni était avec des noms de variables, et non des tableaux, etc... mais rien n'est précisé

  15. #15
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    j'utilise des vector<> car mes tableaux ne sont pas de taille fixe , en plus je veux pas utilisé des pointeurs, donc pour moi vector<int> est la meilleur solution
    pour le code:
    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
     
    if(v1.size() < v2.size())
        {
        v3.resize(2*v1.size())
        }
    else
        {
        v3.resize(2*v2.size());
        }
     
    for(unsigned int i = 0; i < v3.size(); i += 2)
    {
    v3[i] = v1[i / 2];
    v3[i + 1] = v2[i / 2];
    }
    je l'ai compris, mais en cas de plusieurs vecteurs , c'est ça le problème
    mais pour l'autre code j'ai pas compris
    vector<int>* TabVecteurs[nbvecteurs] = {&v1, &v2, ...};
    c'est quoi ça???
    ça peut pas se faire sans les pointeurs???
    mes vecteurs sont stocké dans une matrice de type:
    vector<vector<int> >matrice;

  16. #16
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    si, tu peux faire sans les pointeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    vector<int> v_final;
     
    v_final.reserve(taille_totale);
     
    for (int i = 0; i < plus_grande_taille; i++)
    {
        for(int j = 0; j < matrice.size(); j++)
        {
              v_final.push_back(matrice[j][i]);
        }
    }
    Le fait que tu aies déjà une matrice simplifie tout
    Si tu veux optimiser un peu plus, dans la deuxième boucle imbriquée tu peux utiliser un iterator, mais ce n'est pas nécessaire.

    Pour plus_grande_taille et taille_totale, elles correspondent respectivement à la taille du vecteur le plus grand, et à la somme des tailles des vecteurs, tu peux déterminer ces variables facilement.

  17. #17
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    mais ça va me faire des erreurs car les vecteurs ne sont pas de meme taille
    donc si ma matrice contient 2 vecteurs
    et le premier de taille 4 et le deuxième vecteur de taille 3

    vector<vector<int> >matrice;
    vector<int>v1(4);
    vector<int>v2(3);
    matrice.push_back(v1);
    matrice.push_back(v2);

    alors à l'instant i=3
    v_final.push_back(matrice[1][3]);
    qui n'existe pas
    alors il manque un test

  18. #18
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par fatjoe Voir le message
    alors il manque un test
    On ne peut pas toujours te donner un code exacte. Tu doit pouvoir adapter ces codes. Trouver ce qui te manque est très simple.
    Ça ne sert à rien que l'on te donne du code si tu n'essaie même pas de le comprend...

  19. #19
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    merci pour tout vos aide,
    je l'ai trouvé.
    vous êtes géniale

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

Discussions similaires

  1. Remplissage d'un vecteur avec valeur milieu imposée
    Par amarion dans le forum MATLAB
    Réponses: 6
    Dernier message: 17/03/2008, 15h25
  2. chercher un max et min dans une liste de type vector
    Par sandy07 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 29/05/2007, 15h23
  3. Réponses: 2
    Dernier message: 16/05/2007, 16h13
  4. Unification des types "vector"
    Par Bourrine dans le forum SL & STL
    Réponses: 4
    Dernier message: 02/02/2007, 13h57
  5. [Debutant][Collection] Création d'un vecteur de type d'une classe
    Par Tao® dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 22/04/2004, 17h06

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