Initialisation d'un std :: vector bidimensionnel

116

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 cela semble très faux ... Y a-t-il une autre façon d'initialiser un vecteur comme celui-ci?

Ferenc Deak
la source
4
Je recommanderais une implémentation de vecteur 1d pour un vecteur 2d si vous n'avez pas besoin de plus d'espace que std::vector<int>::max_size(). Ici
andre
Cela aurait été bien si au moins une des réponses n'impliquait pas de copier le vecteur interne: memset est plus rapide que memcpy (et calloc encore mieux si l'opérateur new est inséré).
Marc Glisse le

Réponses:

199

Utilisez le std::vector::vector(count, value)constructeur 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, 4par exemple, 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 a été introduite dans C ++ 11, qui permet l'initialisation de vector, et d'autres conteneurs, en utilisant {}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };
hmjd
la source
Et si je crée la classe de stockage de std :: vector <std :: vector <int>>as static?
strikersps le
40

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;
}
Jason
la source
Je viens de gagner une «bonne réponse» grâce à cette réponse. D'autres personnes ont déjà donné la même réponse, mais ceux qui votent pour celle-ci peuvent être similaires à moi lorsque je suis arrivé à ce poste, que nous n'avons pas reconnu que certaines autres réponses sont en fait la même réponse. Je pense que cela pourrait être dû à trois raisons: 1) ce code pourrait être copié, collé et exécuté tout de suite 2) le std::rend plus long et les gens pourraient aimer une réponse courte et directe; 3) le nom long des variables déroute les débutants. Je suis aussi un débutant, je ne sais pas vraiment à quel point nous avons besoin std::, j'ai besoin d'un code exécutable pour que je sache ce que fait chaque variable
Jason
35

Il n'y a pas de appendméthode dans std::vector, mais si vous voulez créer un vecteur contenant des A_NUMBERvecteurs de int, chacun de ceux contenant des other_numberzéros, vous pouvez le faire:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));
juanchopanza
la source
8

La syntaxe générale, comme déjà décrite, est:

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'.

Cela peut également ê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é mentionnés dans d'autres réponses ....!

sarthakgupta072
la source
3

Je pense que le moyen le plus simple de le faire est:

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

10 est la taille du vecteur externe ou global, qui est le principal, et 11 est 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 ça aide quelqu'un.

Muhirwa Gabo Oreste
la source
2

Supposons que vous souhaitiez initialiser un vecteur entier à deux dimensions avec n lignes et m colonnes ayant chacune la valeur ' VAL '

Écrivez-le comme

std::vector<vector<int>> arr(n, vector<int>(m,VAL));

Ce VAL peut être une variable de type entier ou une constante telle que 100


la source
1

L'approche recommandée consiste à utiliser le constructeur de remplissage 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.

Smit
la source
1

Mon c++ STLcode pour initialiser 5*3 2-D vectoraveczero


#include <iostream>
using namespace std;
#include <vector>
int main()
{// if we wnt to initialise a 2 D vector with 0;

    vector<vector<int>> v1(5, vector<int>(3,0));

    for(int i=0;i<v1.size();i++) 
{
        for(int j=0;j<v1[i].size();j++)

           cout<<v1[i][j]<<" ";

            cout<<endl;
    }
}
Ritik Kamboj
la source