web-dev-qa-db-fra.com

Initialiser un vecteur std :: en deux dimensions

Donc, j'ai ce qui suit:

std::vector< std::vector <int> > fog;

et je l'initialise très naïvement comme:

    for(int i=0; i<A_NUMBER; i++)
    {
            std::vector <int> fogRow;
            for(int j=0; j<OTHER_NUMBER; j++)
            {
                 fogRow.Push_back( 0 );
            }
            fog.Push_back(fogRow);
    }

Et on se sent très mal… Y a-t-il une autre façon d’initialiser un tel vecteur?

88
Ferenc Deak

Utilisez le constructeur std::vector::vector(count, value) qui accepte une taille initiale et une valeur par défaut:

std::vector<std::vector<int> > fog(
    A_NUMBER,
    std::vector<int>(OTHER_NUMBER)); // Defaults to zero initial value

Si une valeur autre que zéro, par exemple 4, devait être la valeur par défaut, alors:

std::vector<std::vector<int> > fog(
    A_NUMBER,
    std::vector<int>(OTHER_NUMBER, 4));

Je devrais également mentionner que l’initialisation uniforme est introduite dans C++ 11, ce qui permet d’initialiser vector et d’autres conteneurs en utilisant {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };
154
hmjd

Il n'y a pas de méthode append dans std::vector, mais si vous souhaitez créer un vecteur contenant A_NUMBER vecteurs de int, chacun de ceux contenant other_number zéros, alors tu peux le faire:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));
32
juanchopanza

Supposons que vous souhaitiez initialiser le vecteur 2D, m * n, avec une valeur initiale égale à 0

on pourrait faire ça

#include<iostream>
int main(){ 
    int m = 2, n = 5;

    vector<vector<int>> vec(m, vector<int> (n, 0));

    return 0;
}
16
Jason

La syntaxe générale, telle qu'elle est décrite, est la suivante:

std::vector<std::vector<int> > v (A_NUMBER, std::vector <int> (OTHER_NUMBER, DEFAULT_VALUE))  

Ici, le vecteur 'v' peut être visualisé comme un tableau à deux dimensions, avec 'A_NUMBER' de lignes, avec 'OTHER_NUMBER' de colonnes avec leur valeur initiale définie sur 'DEFAULT_VALUE'.

En outre, il peut être écrit comme ceci:

std::vector <int> line(OTHER_NUMBER, DEFAULT_VALUE)
std::vector<std::vector<int> > v(A_NUMBER, line)

La saisie de valeurs dans un vecteur 2D est similaire à la saisie de valeurs dans un tableau 2D:

for(int i = 0; i < A_NUMBER; i++) {
     for(int j = 0; j < OTHER_NUMBER; j++) {
         std::cin >> v[i][j]
     }
}

Des exemples ont déjà été donnés dans d'autres réponses ....!

6
sarthak-sopho

Je pense que la meilleure façon de le faire est de:

std::vector<std::vector<int>>v(10,std::vector<int>(11,100));

10 est la taille du vecteur externe ou global, qui est le vecteur principal, et 11, la taille du vecteur interne de type int, et les valeurs initiales sont initialisées à 100! C'est ma première aide sur la pile, je pense que cela aide quelqu'un.

1

L'approche recommandée consiste à utiliser le constructeur de remplissage pour initialiser un vecteur à deux dimensions avec la valeur par défaut donnée:

vector<std::vector<int>> fog(M, std::vector<int>(N, default_value));

où, M et N sont des dimensions pour votre vecteur 2D.

0
Smit