web-dev-qa-db-fra.com

Vecteur multidimensionnel

Comment créer un vecteur 2D? Je sais que dans un tableau 2D, je peux l'exprimer comme suit:

a[0][1]=98;
a[0][2]=95;
a[0][3]=99;
a[0][4]=910;

a[1][0]=98;
a[1][1]=989;
a[1][2]=981;
a[1][3]=987;

Comment peut-on faire cela en utilisant le vecteur C++ STL?

30
karthigeyan

vector<vector<int> > a;

Si vous voulez définir les lignes et les colonnes,

vector<vector<int> > a{{11, 2, 4}, {4, 5, 6}, {10, 8, -12}};

32
Ari
std::vector< std::vector< int > > a; // as Ari pointed

Son utilisation pour une matrice en croissance peut devenir complexe, car le système ne garantit pas que tous les vecteurs internes ont la même taille. Chaque fois que vous développez sur la deuxième dimension, vous devez développer explicitement tous les vecteurs.

// grow twice in the first dimension
a.Push_back( vector<int>() );
a.Push_back( vector<int>() );

a[0].Push_back( 5 ); // a[0].size() == 1, a[1].size()==0

Si cela vous convient (ce n'est pas vraiment une matrice, mais un vecteur de vecteurs), ça devrait aller. Sinon, vous devrez faire très attention à garder la deuxième dimension stable sur tous les vecteurs.

Si vous planifiez sur une matrice de taille fixe, vous devriez envisager d'encapsuler dans une classe et de substituer operator () au lieu de fournir la syntaxe à double tableau. Lisez la FAQ C++ concernant ceci ici

std::vector< std::vector<int> > a;

    //m * n is the size of the matrix

    int m = 2, n = 4;
    //Grow rows by m
    a.resize(m);
    for(int i = 0 ; i < m ; ++i)
    {
        //Grow Columns by n
        a[i].resize(n);
    }
    //Now you have matrix m*n with default values

    //you can use the Matrix, now
    a[1][0]=98;
    a[1][1]=989;
    a[1][2]=981;
    a[1][3]=987;

//OR
for(i = 0 ; i < m ; ++i)
{
    for(int j = 0 ; j < n ; ++j)
    {      //modify matrix
        int x = a[i][j];
    }

}
13
aJ.

Déclaration d'une matrice, par exemple, avec 5 lignes et 3 colonnes:

vector<vector<int> > new_matrix(5,vector<int>(3));

Un autre moyen de déclaration pour obtenir le même résultat que ci-dessus:

vector<int> Row;    

Une rangée de la matrice:

vector<Row> My_matrix;

My_matrix est un vecteur de lignes:

My_matrix new_matrix(5,Row(3)); 
1
IluxaKuk

Comme Ari l'a souligné, vector< vector< int>> est la bonne façon de le faire.

En plus de cela, dans de tels cas, je pense toujours à envelopper le vecteur intérieur (en réalité, ce qu'il représente) dans une classe, car les structures STL complexes ont tendance à devenir maladroites et déroutantes.

0
Igor Oks

Utilisez simplement la méthode suivante pour utiliser le vecteur 2D.

int rows, columns;        

// . . .

vector < vector < int > > Matrix(rows, vector< int >(columns,0));

                                  Or

vector < vector < int > > Matrix;
Matrix.assign(rows, vector < int >(columns, 0));

// Do your stuff here...

Cela créera une matrice de taille lignes * colonnes et l'initialisera avec des zéros, car nous passons un zéro (0) en tant que second argument du constructeur, c'est-à-dire le vecteur <int> (colonnes, 0). 

0
Aditya Goel

la suggestion de dribeas est vraiment la voie à suivre.

Juste pour donner une raison pour laquelle vous pourriez vouloir utiliser la route operator (), considérez que, par exemple, si vos données sont clairsemées, vous pouvez les disposer différemment pour économiser de l'espace en interne et operator () masque ce problème d'implémentation interne à l'utilisateur vous améliorez l’encapsulation et vous permettent de gagner de la place ou de la vitesse en améliorant ultérieurement les modifications apportées à la disposition interne sans casser votre interface.

0