188 votes

Initialisation d'un std::vector à deux dimensions

J'ai donc les éléments suivants :

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 ça semble très mauvais... Existe-t-il une autre façon d'initialiser un vecteur de cette manière ?

345voto

hmjd Points 76411

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

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

Si une valeur différente de zéro, par exemple 4 par exemple, devait alors être la valeur par défaut :

std::vector<std::vector<int> > fog(
    ROW_COUNT,
    std::vector<int>(COLUMN_COUNT, 4));

Je dois également mentionner que l'initialisation uniforme a été introduite dans C++11, ce qui permet l'initialisation de vector et d'autres conteneurs, en utilisant {} :

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

147voto

Jason Points 614

Disons que vous voulez initialiser un vecteur 2D, m*n, avec une valeur initiale de 0.

nous pourrions le faire

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

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

    return 0;
}

37voto

juanchopanza Points 115680

Il n'y a pas append méthode dans std::vector mais si vous voulez faire un vecteur contenant A_NUMBER vecteurs de int chacun d'entre eux contenant other_number des zéros, alors vous pouvez faire ça :

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

11voto

sarthak-sopho Points 107

La syntaxe générale, telle qu'elle a été 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 dont la valeur initiale est fixée à 'DEFAULT_VALUE'.

On peut aussi l'écrire comme ça :

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é cités dans d'autres réponses.... !

8voto

Smit Points 31

L'approche recommandée est d'utiliser le constructeur fill pour initialiser un vecteur bidimensionnel avec une valeur par défaut donnée :

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

où, M et N sont les dimensions de votre vecteur 2D.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X