Vektor Größe ändern() eine automatische füllen
Ich Schreibe eine Klasse, die enthält eine matrix (double Werte), dargestellt als vector<vector<double>>
;
Ich soll zur Umsetzung der operator=
zu re-fill-my-matrix mit den details einer bestimmten sparse-matrix. Ich Schreibe den folgenden code:
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;
}
Macht die resize()
Methode füllen automatisch den Vektor mit Nullen?
Ist meine Anwendung ok?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Neuen Elemente nehmen die
vector
Mitglied der Standardwert oder einen bestimmten Wert, wenn Sie die überlastung vonresize
mit zwei Parametern.In Ihrem Fall, die Voreinstellung ist eine leere
vector<double>
- wenn es das nicht ist, was Sie wollen, übergeben Sie das, was Sie wollen zu setzen, um die überlastung über.Vorhandene Elemente werden nicht geändert.
resize
nennen.clear
im Voraus. Das ist, was ich bin reden über. Warum Sie nennen es eine "verschwenderische Schritt" ist mir nicht ganz klar. Die Lösung, die Sie vorgeschlagen, sich (mitassign
) ist nur ein wrapper überclear
(zumindest laut Spezifikation), gefolgt von einer Folge von sogar weniger effiziente Schritte.Wenn Sie wollen, um null aus der gesamten 2d-array verwenden, können Sie die weisen Sie die Funktion von vector:
Dadurch wird ein 2d-Vektor, der die sizeXsize mit Nullen gefüllt.
In Ihrem Fall:
0
als gut.v.assign(size, vector<double>(size))
wird das gleiche tun.Keiner von
std::vector<>
Methoden überhaupt jede form der Standard-Initialisierung intern.std::vector<>
benötigt nur seine Elemente werden CopyConstructible und Zuweisbare, aber nicht verlangen, Sie DefaultConstructible. Jedes mal, wenn Sie in einer situation, wenn einige Elemente scheinen konstruiert zu sein "aus dem nichts" (wie ist der Fall mit Ihremresize
Aufrufe), es bedeutet normalerweise, dass diestd::vector<>
Methode, die Sie verwenden hat einen zusätzlichen parameter, die können Sie übergeben den Wert an, ab dem die neuen Elemente kopiert werden konstruiert. Wir oft nicht bemerken, dass, da diese Argumente sind immer versorgt mit default-Werten gleich der()
-initailized element des entsprechenden Typs.In Ihrem Fall, die
ist tatsächlich übersetzt in
nennen, was bedeutet, dass formal ist es Ihnen, die implizit vorbei an der Anfangswert für die neuen Elemente.
double()
evaluiert zu null, also ja, die Spalte Vektoren werden mit Nullen aufgefüllt zunächst.clear
bevor Sie andere Aktionen. So gibt es keine vorhandenen Elemente, der im moment desresize
. Was ein Teil davon verstehst du nicht?