2010-10-05 7 views
4

J'écris une classe qui contient une matrice (de valeurs doubles), représentée par vector<vector<double>>;vector redimensionner() remplissage automatique

Je veux implémenter le operator=, pour remplir ma matrice avec les détails d'une matrice clairsemée donnée. J'écris le code suivant:

RegMatrix& RegMatrix::operator=(const SparseMatrix rhs){ 
    if(*this != rhs){ 
     _matrix.clear(); 
     _matrix.resize(rhs.getRow()); 
     int i; 
     for(i=0;i<rhs.getRow();++i){ 
      _matrix.at(i).resize(rhs.getCol()); 
     } 

     for(i=0;i<rhs.getSize();++i){ 
      Element e = rhs.getElement(i); 
      _matrix[e._row][e._col] = e._val; 
     } 
    } 

    return *this; 
} 

Est-ce que la méthode resize() remplir automatiquement le vecteur avec des zéros? Ma mise en œuvre est-elle acceptable?

Répondre

5

Les nouveaux éléments prennent la valeur par défaut du membre vector, ou une valeur spécifique si vous utilisez la surcharge de resize avec deux paramètres.

void resize(
    size_type _Newsize, 
    Type _Val 
); 

Dans votre cas, la valeur par défaut sera un vide vector<double> - si ce n'est pas ce que vous voulez, passer ce que vous voulez y mettre à la surcharge ci-dessus.

Les éléments existants ne sont pas modifiés.

+0

donc, si je veux un vecteur de RowXCol de Zise, et l'élément de chaque vecteur intérieur à deux dimensions aura la valeur de 0, je devrais changer la ligne de sorte qu'il regarderait comme ça: _matrix.at (i) .resize (rhs.getCol(), 0); ? – limlim

+0

@limlim: Vous n'avez pas besoin de le changer. Vous passez déjà ce zéro * implicitement *. Vous pouvez également passer ce zéro explicitement, mais cela ne changera rien.Si vous croyez que passer ce 0 explicitement votre code plus clair, alors vous pouvez aller de l'avant et le mettre là. Mais cela ne fera aucune différence sur le plan de la fonctionnalité. – AnT

+0

Si je ne me trompe pas, redimensionner ne mettra pas à zéro les éléments existants. Si c'est ce que vous voulez faire, utilisez assign (consultez ma réponse pour plus d'informations). – JoshD

0

Aucune des méthodes std::vector<> n'utilise jamais une forme d'initialisation par défaut interne. std::vector<> exige uniquement que ses éléments soient CopyConstructible et Affectable, mais ne nécessite pas qu'ils soient DefaultConstructible. Chaque fois que vous rencontrez une situation où certains éléments semblent être construits "à partir de rien" (comme c'est le cas avec vos appels resize) cela signifie normalement que la méthode std::vector<> que vous utilisez a un paramètre supplémentaire, qui vous permet de passer le valeur à partir de laquelle les nouveaux éléments seront construits en copie. Nous ne remarquons pas souvent que, puisque ces arguments sont toujours fournis avec des valeurs par défaut égales à l'élément () -initailized du type correspondant.

Dans votre cas, la

_matrix.at(i).resize(rhs.getCol()); 

est en fait traduit en

_matrix.at(i).resize(rhs.getCol(), double()); 

appel, ce qui signifie que formellement c'est vous qui est implicitement passer la valeur initiale pour les nouveaux éléments.

double()double() évalue à zéro, donc oui, les vecteurs de colonne seront initialement remplis de zéros.

+0

Non, seuls les éléments nouvellement ajoutés (le cas échéant) seront nuls. –

+0

@ c-urchin: Hein? Tout d'abord, lorsque je dis «nouveaux éléments», il s'agit d'éléments moyens nouvellement ajoutés, ce qui est suffisamment clair. Deuxièmement, ma dernière remarque s'applique au code de l'OP spécifique, où le vecteur est * vide * initialement. Donc, il sera * rempli * de zéros après redimensionnement, comme je l'ai dit. – AnT

+0

Pourquoi si sensible? En fait, l'OP dit (s'il-vous-plait le relire) "re-fill", ce qui implique que certaines valeurs ont déjà été définies. –

2

Si vous voulez mettre à zéro l'ensemble de tableau 2D, vous pouvez utiliser le assign function of vector:

v.assign(size, vector<double>(size, 0.)); 

Cela fera un vecteur 2d de sizeXsize rempli de zéros.

Dans votre cas:

RegMatrix& RegMatrix::operator=(const SparseMatrix rhs){ 
    if(*this != rhs){ 
     _matrix.assign(rhs.getRow(), vector<double>(rhs.getCol(), 0.)); 

     for(i=0;i<rhs.getSize();++i){ 
      Element e = rhs.getElement(i); 
      _matrix[e._row][e._col] = e._val; 
     } 
    } 

    return *this; 
} 
+0

Aucun besoin formel d'un «0» explicite également. 'v.assign (taille, vecteur (size))' fera la même chose. – AnT

Questions connexes