2010-09-20 6 views
1

J'essaie d'initialiser toutes les cellules d'une matrice avec des valeurs NULL, mais quelque chose ne va pas ici.
le code:Comment mettre NULL dans toutes les cellules d'un vecteur matriciel?

vector<vector<Distance*> > distanceMatrix; 
    for (int i = 0; i < 7 ; i++) 
     for (int j = 0; j < 7 ; j++) 
      distanceMatrix[i][j].push_back(NULL); 

je parie que c'est quelque chose de stupide, merci pour l'aide.

+1

Vous pouvez envisager d'utiliser boost :: ptr_vector ici - http: //www.boost.org/doc/libs/1_44_0/libs/ptr_container/doc/ptr_container.html –

+0

Vous ne pouvez pas utiliser l'opérateur d'indexation en toute sécurité avant d'avoir rempli les entrées du vecteur. Changez-le à la sécurité-checked à() à vous aurez quelques exceptions utiles pour vous aider à corriger votre code. En résumé, vous devez pousser les objets vectoriels 'dans distanceMatrix avant de pouvoir y insérer des' Distance * '. –

Répondre

9

De l'std::vectorreference page:

vecteurs peuvent être construits avec des valeurs en eux.

Vous pouvez essayer:

vector<vector<Distance*> > distanceMatrix(7, vector<Distance*>(7, NULL)); 

En outre, en ce qui concerne votre problème:

vector<vector<Distance*> > distanceMatrix; 
    for (int i = 0; i < 7 ; i++) 
     for (int j = 0; j < 7 ; j++) 
      distanceMatrix[i][j].push_back(NULL); //1 

Lorsque vous codez premier à atteindre //1, distanceMatrix[i] décide de distanceMatrix[0] mais vous n'avez pas appelé distanceMatrix.push_back(vector<Distance*>()) si vous font référence à une cellule non initialisée.

Pour corriger le code aurait été:

vector<Distance*> vec; 

for (int j = 0; j < 7 ; j++) 
    vec.push_back(NULL); 

vector<vector<Distance*> > distanceMatrix; 

for (int i = 0; i < 7 ; i++) 
{ 
    distanceMatrix.push_back(vec); 
} 

Ce qui est encore bien pire que ma première suggestion.

+1

est la valeur NULL requise pour le vecteur des pointeurs? Quelle serait la valeur par défaut ici? –

+0

@Steve Townsend: Vous avez raison, 'NULL' est probablement la valeur par défaut. Cependant, je voulais rendre plus explicite les paramètres pris par le constructeur. – ereOn

+0

absolument, juste curieux. N'utilisez jamais moi-même les vecteurs de ptrs. –

1

La matrice est vide pour commencer, vous devez push_back chaque valeur et chaque ligne, et non en fonction de sa position dans la matrice:

vector<Distance*> row; 
for(int j=0; j < 7; j++) 
    row.push_back(NULL); 

vector<vector<Distance*> > distanceMatrix; 
for(int i=0; i < 7; i++) 
    distanceMatrix.push_back(row); 
+0

'push_back (nouveau vecteur (ligne));' crée un vecteur dynamique qui n'est utilisé que momentanément pour l'initialisation de distanceMatrix, puis qui fuit ...: - /. –

+0

Cette approche (si elle est fixée) impliquerait beaucoup de copie de rangée, gênante pour les matrices plus grandes que le 7x7 ici –

+0

Je pensais "Je ferais mieux de copier ceci", mais meh. J'échoue;) – You

Questions connexes