web-dev-qa-db-fra.com

Attribution de valeurs au vecteur 2D à l'aide d'indices

J'essaie d'ajouter des valeurs à un vecteur 2D en utilisant les deux indices. Lorsque je lance mon programme, je reçois le message Windows indiquant que le programme a cessé de fonctionner. L'utilisation de Dev-C++ pour le débogage a montré qu'il y avait une erreur de segmentation (je ne suis pas sûr de ce que cela signifie). S'il vous plaît ne suggérez pas d'utiliser des tableaux, je dois utiliser des vecteurs pour cette affectation.

#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char** argv) { 

vector< vector<int> > matrix;
cout << "Filling matrix with test numbers.";
for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {

        matrix[i][j] = 5; // causes program to stop working

    }
}
}

J'ai créé un scénario de test dans lequel je souhaite remplir une matrice 3X3 avec la valeur 5. Je suppose que cela a quelque chose à voir avec la taille du vecteur 2D non spécifiquement définie. Comment pourrais-je remplir un vecteur 2D avec des valeurs en utilisant les indices?

7
AvP

Comme cela est écrit, c'est problématique, vous essayez d'écrire sur un vecteur pour lequel vous n'avez pas encore alloué de mémoire.

Option 1 - Redimensionnez vos vecteurs à l'avance

vector< vector<int> > matrix;
cout << "Filling matrix with test numbers.";
matrix.resize(4);  // resize top level vector
for (int i = 0; i < 4; i++)
{
    matrix[i].resize(4);  // resize each of the contained vectors
    for (int j = 0; j < 4; j++)
    {
        matrix[i][j] = 5;
    }
}

Option 2 - Dimensionnez votre vecteur lorsque vous le déclarez

vector<vector<int>>  matrix(4, vector<int>(4));

Option 3 - Utilisez Push_back pour redimensionner le vecteur si nécessaire.

vector< vector<int> > matrix;
cout << "Filling matrix with test numbers.";
for (int i = 0; i < 4; i++)
{
    vector<int> temp;
    for (int j = 0; j < 4; j++)
    {
        temp.Push_back(5);
    }
    matrix.Push_back(temp);
}
12
CoryKramer

Vous n'avez alloué aucun espace pour votre vecteur 2D. Donc, dans votre code actuel, vous essayez d'accéder à de la mémoire qui n'appartient pas à l'espace mémoire de votre programme. Cela entraînera une erreur de segmentation.

essayer:

 vector<vector<int> >  matrix(4, vector<int>(4));

Si vous voulez donner la même valeur à tous les éléments, vous pouvez essayer:

 vector<vector<int> >  matrix(4, vector<int>(4,5)); // all values are now 5
3
taocp
vector<int> v2d1(3, 7);
    vector<vector<int> > v2d2(4, v2d1);
    for (int i = 0; i < v2d2.size(); i++) {
        for(int j=0; j <v2d2[i].size(); j++) {
                    cout<<v2d2[i][j]<<" ";
                }
                cout << endl;
            }
0
Mohammad Jawad