Partage
  • Partager sur Facebook
  • Partager sur Twitter

remplissage d'un "vector"

comment remplir un vector avec une boucle ?

    20 août 2007 à 10:54:10

    Bonjour.

    Je cherche à créer un tableau de type vector, et à le remplir via une boucle (en l'occurence, une boucle for).

    Le problème est qu'à chaque itération, la veleur réelle de la variable est modifiée, mais que c'est toujours la même chose qui est ajoutée dans le tableau.
    J'ai testé avec des double normaux, des réferences et des pointeurs, voilà le code :

    1. void test (double (*a)) {
    2.   double c;
    3.   c=3;
    4.   a[0]*=c;  
    5.   a[1]*=c;
    6.   a[2]*=c;
    7. }
    8. main (){
    9.   double *b;
    10.   b=new double [3];
    11.   b[0]=1;
    12.   b[1]=2;
    13.   b[2]=3;
    14.   test(b);
    15.   cout<<"b=("<<b[0]<<","<<b[1]<<","<<b[2]<<")"<<endl;
    16.   vector<double> v;
    17.   vector<vector<double> > vecteur;
    18.   int it;
    19.   it=3;
    20. /*  
    21. /////////////////////// Pointeurs ////////////////////////////
    22.      for(int k=0;k<it;k++) {
    23.     cout<<"b=("<<b[0]<<","<<b[1]<<","<<b[2]<<")"<<endl;
    24.     cout<<"test 1, itertaion "<<k<<endl;
    25.     v.push_back(b[0]);
    26.     cout<<"test 1, itertaion "<<k<<endl;
    27.     v.push_back(b[1]);
    28.     cout<<"test 1, itertaion "<<k<<endl;
    29.     v.push_back(b[2]);
    30.     cout<<"test 1, itertaion "<<k<<endl;
    31.     vecteur.push_back(v);
    32.     cout<<"test 1, itertaion "<<k<<endl;
    33.     cout<<"vecteur("<<k<<") = ("<<vecteur[k][0]<<","<<vecteur[k][1]<<","<<vecteur[k][2]<<")"<<endl;
    34.     test(b);
    35.     cout<<"b=("<<b[0]<<","<<b[1]<<","<<b[2]<<")"<<endl;
    36.   }
    37.   cout<<"vecteur("<<0<<") = ("<<vecteur[0][0]<<","<<vecteur[0][1]<<","<<vecteur[0][2]<<")"<<endl;
    38.   cout<<"vecteur("<<1<<") = ("<<vecteur[1][0]<<","<<vecteur[1][1]<<","<<vecteur[1][2]<<")"<<endl;
    39.   cout<<"vecteur("<<2<<") = ("<<vecteur[2][0]<<","<<vecteur[2][1]<<","<<vecteur[2][2]<<")"<<endl;
    40. */
    41. //////////////////////////// Doubles ///////////////////////////
    42.   double B[3];
    43.   B[0]=1;
    44.   B[1]=2;
    45.   B[2]=3;
    46.   double BB[3];
    47.   BB[0]=B[0];
    48.   BB[1]=B[1];
    49.   BB[2]=B[2];
    50.   for(int k=0;k<it;k++) {
    51.   /*  double BB[3];
    52.     BB[0]=B[0];
    53.     BB[1]=B[1];
    54.     BB[2]=B[2];*/
    55.     cout<<"BB=("<<BB[0]<<","<<BB[1]<<","<<BB[2]<<")"<<endl;
    56. //    cout<<"test 1, itertaion "<<k<<endl;
    57.     v.push_back(BB[0]);
    58. //    cout<<"test 2, itertaion "<<k<<endl;
    59.     v.push_back(BB[1]);
    60. //    cout<<"test 3, itertaion "<<k<<endl;
    61.     v.push_back(BB[2]);
    62. //    cout<<"test 4, itertaion "<<k<<endl;
    63.     vecteur.push_back(v);
    64. //    cout<<"test 5, itertaion "<<k<<endl;
    65.     cout<<"vecteur("<<k<<") = ("<<vecteur[k][0]<<","<<vecteur[k][1]<<","<<vecteur[k][2]<<")"<<endl;
    66.     B[0]*=3;
    67.     B[1]*=3;
    68.     B[2]*=3;
    69.     cout<<"B=("<<B[0]<<","<<B[1]<<","<<B[2]<<")"<<endl;
    70.   }
    71.   cout<<"vecteur("<<0<<") = ("<<vecteur[0][0]<<","<<vecteur[0][1]<<","<<vecteur[0][2]<<")"<<endl;
    72.   cout<<"vecteur("<<1<<") = ("<<vecteur[1][0]<<","<<vecteur[1][1]<<","<<vecteur[1][2]<<")"<<endl;
    73.   cout<<"vecteur("<<2<<") = ("<<vecteur[2][0]<<","<<vecteur[2][1]<<","<<vecteur[2][2]<<")"<<endl;
    74. /*  
    75. ///////////////////////// References ///////////////////////////
    76.   double &ref0=B[0];
    77.   double &ref1=B[1];
    78.   double &ref2=B[2];
    79.   for(int k=0;k<it;k++) {
    80. //      double &ref0=B[0];
    81. //      double &ref1=B[1];
    82. //      double &ref2=B[2];
    83.     cout<<"ref=("<<ref0<<","<<ref1<<","<<ref2<<")"<<endl;
    84. //    cout<<"test 1, itertaion "<<k<<endl;
    85.     v.push_back(ref0);
    86. //    cout<<"test 2, itertaion "<<k<<endl;
    87.     v.push_back(ref1);
    88. //    cout<<"test 3, itertaion "<<k<<endl;
    89.     v.push_back(ref2);
    90. //    cout<<"test 4, itertaion "<<k<<endl;
    91.     vecteur.push_back(v);
    92. //    cout<<"test 5, itertaion "<<k<<endl;
    93.     cout<<"vecteur("<<k<<") = ("<<vecteur[k][0]<<","<<vecteur[k][1]<<","<<vecteur[k][2]<<")"<<endl;
    94.     B[0]*=3;
    95.     B[1]*=3;
    96.     B[2]*=3;
    97.     cout<<"B=("<<B[0]<<","<<B[1]<<","<<B[2]<<")"<<endl;
    98.   }
    99.   cout<<"vecteur("<<0<<") = ("<<vecteur[0][0]<<","<<vecteur[0][1]<<","<<vecteur[0][2]<<")"<<endl;
    100.   cout<<"vecteur("<<1<<") = ("<<vecteur[1][0]<<","<<vecteur[1][1]<<","<<vecteur[1][2]<<")"<<endl;
    101.   cout<<"vecteur("<<2<<") = ("<<vecteur[2][0]<<","<<vecteur[2][1]<<","<<vecteur[2][2]<<")"<<endl;*/
    102.   v.clear();
    103.   vecteur.clear();
    104.   delete[] b;
    105. }



    Et le résultat est, avec les trois méthodes :
    b=(3,6,9)
    BB=(1,2,3)
    vecteur(0) = (1,2,3)
    B=(3,6,9)
    BB=(1,2,3)
    vecteur(1) = (1,2,3)
    B=(9,18,27)
    BB=(1,2,3)
    vecteur(2) = (1,2,3)
    B=(27,54,81)
    vecteur(0) = (1,2,3)
    vecteur(1) = (1,2,3)
    vecteur(2) = (1,2,3)



    Comment faire pour obtenir :
    vecteur(0) = (1,2,3)
    vecteur(1) = (3,6,9)
    vecteur(2) = (9,18,27)
    • Partager sur Facebook
    • Partager sur Twitter
      20 août 2007 à 11:41:48

      Comment tu l'aurais fait si c'était pas un vector ?

      Si tu as la solution, il ne reste plus qu'à faire les push_back.

      Sinon réfléchis à ma question.
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        20 août 2007 à 17:26:25

        je crois que tu n'as pas compris le déroulement d'une boucle non plus :p

        Regarde les différences avec mon exemple, je te laisse décrouvrir ce qu'il fait (essai avec un papier et un crayon avant de le tester dans un compilateur)
        1. #include <vector>
        2. #include <iostream>
        3. using namespace std;
        4. const size_t MAX_TAILLE = 5;
        5. int main()
        6. {
        7.     vector<int> v;
        8.     // insertion des valeurs
        9.     cout << "Insertion des valeurs";
        10.     for( size_t i = 0; i < MAX_TAILLE; i++ )
        11.     {
        12.         v.push_back( i * i );
        13.         cout << "iteration #" << i << " taille vector = " << v.size() << endl;
        14.     }
        15.     // lecture des valeurs
        16.     cout << endl << endl << "valeurs du vector v = ( ";
        17.     for( size_t j = 0; j < MAX_TAILLE; j++ )
        18.     {
        19.         if( j > 0 )
        20.             cout << ", ";
        21.         cout << v[ j ];
        22.     }
        23.     cout << " )" << endl;
        24.     return 0;
        25. }


        Les size_t ne sont qu'un type défini comme type contenant une taille d'un vector (parmis tant d'autres)... c'est un standard. Actuellement size_t c'est un unsigned int mais cela peut changer d'un compilateur à l'autre et d'une platforme à l'autre mais cela représentera toujours une taille. Abstraction des données du code niveau 1.
        • Partager sur Facebook
        • Partager sur Twitter
          21 août 2007 à 10:59:06

          Si si, MatteX, je les ai très bien comprises.

          Ton programme crée un vecteur "i²", avec les 5 premiers entiers au carrés. Ensuite, tu lis le résultat (et tu obtiens : "valeur du vector v = (0,1,4,9,16)" )

          Le mien devrait créer un tableau :
          1 2 3
          3 6 9
          9 18 27

          Et dans la boucle, je sors au fur et à mesure les valeurs de mes variables (B) et la ligne (BB=v) que j'ajoute.
          Et ce code marche très bien, si ce n'est que j'avais oublié un v.clear() ....
          :-°

          Ce qui me gène au plus haut point, parce que ce truc n'est qu'un test tout bête de l'utilisation des vectors, et que j'ai un programme beaucoup plus compliqué qui en utilise, dans lequel je n'ai pas oublié le .clear, et qui ne marche pas, je ne sais pas où :'(

          Enfin merci :)
          • Partager sur Facebook
          • Partager sur Twitter
            21 août 2007 à 12:41:31

            1. std::vector<std::vector<int> > MonVecteur(3, std::vector<int>(3,0));
            2. int inc(1);
            3. for(int i(1);i<4;++i)
            4. {
            5.   for(int j(1);j<4;++j)
            6.   {
            7.     MonVecteur[i-1][j-1] = j*inc;
            8.   }
            9.   inc *= 3;
            10. }

            Ca joue, ca?

            (code a l'arrache...)
            • Partager sur Facebook
            • Partager sur Twitter
              21 août 2007 à 17:02:40

              1) ton utilisation de tableau me semble totalement inutile
              2) tu peux tout faire à partir de tes 2 vecteurs
              3) tu aurais pu utiliser des boucle pour remplir tes tableaux (vector)
              4) un instruction comme ça c'est inutile :
              1. int it;
              2. it = 3;
              3. for( int i = 0; i < it; i++ )
              4. //...

              Utilise plutôt des constantes
              1. const int MAX_TAILLE = 3;
              2. int main()
              3. {
              4.     //...
              5.     for( int i = 0; i < MAX_TAILLE; i++ )
              6.     //...

              C'est plus lisible et plus concret, on sait que sait une constante.

              Bon comme un exemple vaut mille mots, voici ma façon de le faire... dans l'exemple il n'y a que 2 constantes littérales numériques et je n'ai qu'un seul tampon( v ) toi tu avais B, BB et v : inutile.

              dans mes constantes litérales les "size_t i = 0" ne compte pas comme de la mal-programmation parce c'est standard que l'origine d'un conteneur est 0. même chose pour le "j > 0" et le "i + 1 < MAX_TAILLE" puisque ce sont des manipulation sur une taille qui se décrivent par elles-mêmes.

              les 2 autres ont été commentées.

              il reste les chaines de caractère mais bien aéré ont voit facilement de quoi il s'agit.

              1. const size_t MAX_TAILLE = 3;
              2. int main()
              3. {
              4.     vector< size_t > v;
              5.     vector< vector< size_t > > vecteur;
              6.     // initialisation du vector v de base et affichage
              7.     for( size_t i = 0; i < MAX_TAILLE; i++ )
              8.     {
              9.         // incrémente la position pour aller de 1 à MAX_TAILLE
              10.         v.push_back( i + 1 );
              11.         cout << " v(" << i << ") = " << v[ i ] << endl;
              12.     }
              13.     // Remplissage du vector vecteur et affichage
              14.     for( size_t i = 0; i < MAX_TAILLE; i++ )
              15.     {
              16.         vecteur.push_back( v );
              17.         cout << "vecteur(" << i << ") = ";
              18.         for( size_t j = 0; j < MAX_TAILLE; j++ )
              19.         {
              20.             if( j > 0 )
              21.                 cout << ", ";
              22.             cout << vecteur[ i ][ j ];
              23.         }
              24.         cout << endl;
              25.         if( i + 1 < MAX_TAILLE )
              26.         {
              27.             // Augmente les valeurs de v par 3 si on est pas à la fin et affichage
              28.             for( size_t j = 0; j < MAX_TAILLE; j++ )
              29.             {
              30.                 v[ j ] *= 3;
              31.                 cout << " v(" << j << ") = " << v[ j ] << endl;
              32.             }
              33.         }
              34.     }
              35.     // Affichage des valeurs contenues dans vecteur
              36.     cout << endl << "Resultat :" << endl;
              37.     for( size_t i = 0; i < MAX_TAILLE; i++ )
              38.     {
              39.         cout << "vecteur(" << i << ") = ";
              40.         for( size_t j = 0; j < MAX_TAILLE; j++ )
              41.         {
              42.             if( j > 0 )
              43.                 cout << ", ";
              44.             cout << vecteur[ i ][ j ];
              45.         }
              46.         cout << endl;
              47.     }
              48.     return 0;
              49. }


              Si MAX_TAILLE = 3
              v(0) = 1
              v(1) = 2
              v(2) = 3
              vecteur(0) = 1, 2, 3
              v(0) = 3
              v(1) = 6
              v(2) = 9
              vecteur(1) = 3, 6, 9
              v(0) = 9
              v(1) = 18
              v(2) = 36
              vecteur(2) = 9, 18, 36
              Resultat :
              vecteur(0) = 1, 2, 3
              vecteur(1) = 3, 6, 9
              vecteur(2) = 9, 18, 36


              Tu peux essayer avec d'autres tailles mon code est maléable...
              • Partager sur Facebook
              • Partager sur Twitter

              remplissage d'un "vector"

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown