arrayübergabe so fehleranfällig?
-
Hallo,
ich rufe meine funktion in der mein array verändert wird so auf:
std::vector< double > vec; Method1(col, dimension, vec);und die funktion an sich ist so aufgebaut:
void Class::Method1(const int col, const int dimension, std::vector< double >& vec) { vec.clear(); vec.resize(dimension, 0.0); vec[col] = 1.0; }Jetzt würde ich gern wissen ob die übergabe so fehlerunanfällig ist? Oder ist es viel besser mit pointern anstatt mit referenzen zu arbeiten?
Oder gar mit kopien in der gecallten funktion?Danke euch
-
Ist so in Ordnung, wie du es gemacht hast. Referenzen sind Pointern vorzuziehen, wenn man sie denn verwenden kann. Kopieren ist, insbesondere bei potential großen Objekten wie einem vector, im Allgemeinen keine gute Idee (es sei denn, du brauchst wirklich eine Kopie).
-
void Class // class "Class"? Das ist hoffentlich nur ein schlechtes Beispiel, // kein Bezeichner in deinem tatsaechlichen Code!? ::Method1( // dto. std::vector< double >& vec, // hier scheint der vector die Hauptrolle zu // spielen, also nach vorn mit ihm const int dimension, const int col ) { if (dimension <= col) throw std::invalid_argument("<insert smth. meaningful>"); std::vector<double> res(dimension, 0.0); res[col] = 1.0; vec.swap(res); }
-
Dann sollte man aber auch auf col<0 prüfen. Oder gleich statt operator[] die at-Methode nehmen.
-
Z2 schrieb:
Dann sollte man aber auch auf col<0 prüfen. Oder gleich statt operator[] die at-Methode nehmen.
Ja, stimmt: s/int/std::size_t
edit: Hatte zuerst auch eine alternative Variante mit at reingeschrieben, aber erstens macht es nicht viel Sinn zuerst den vector anzulegen und zweitens finde ich es persönlich stilvoller gleich zu Beginn alle Preconditions zu checken.
-
Danke für eure Hilfe...
@ finix: ich hätte da noch eine frage zu deinem codevec.swap(res);warum sollt denn ein neuer vektor angelegt werden den man dann tauscht mit der referenz? Könntest du/ihr mir nochmal evtl. genauer sagen warum du/man das so macht?
Danke vielmals für eure Hilfe und Antworten