Hinzufügen von Elementen zu einem Vektor
-
So zum Beispiel, weiß aber nicht, ob man das auch mit Arrays machen kann
std::vector<double> const& cSpectrum::getSpec() const { return spec; }
-
Du kannst auch die 3 Werte in einer Klasse/Struktur zusammenfassen und ein paar nützliche Funktionen dafür anbieten. Ein gebräuchlicher Name für die Klasse wäre Vector3 .
-
@thefighter sagte in Hinzufügen von Elementen zu einem Vektor:
weiß aber nicht, ob man das auch mit Arrays machen kann
Man kann in C++ kein rohes Array als Rückgabewert haben (per Value). Was aber geht ist wie Du schon gesagt hast zB. ein
std::vector<>
oder einstd::array<>
. Auch ein Tuple wäre für Deinen Fall denkbar. C++17 (Structured binding declaration):#include <iostream> #include <tuple> auto foo() { return std::make_tuple(1, 2, 3); } int main() { auto [x, y, z] = foo(); std::cout << "x = " << x << ", y = " << y << ", z = " << z << '\n'; }
Seit
ich glaubeC++11(oder C++14?):#include <iostream> #include <tuple> auto foo() { return std::make_tuple(1, 2, 3); } int main() { int x, y, z; std::tie(x, y, z) = foo(); std::cout << "x = " << x << ", y = " << y << ", z = " << z << '\n'; }
-
Danke, ich denke so sollte es passen
std::array<double, 3> const & Particle::getPosition() const { return p; }
Das einzige was ich noch nicht weiß ist, was das zweite const hinter der Klammer bringt.
-
@thefighter sagte in Hinzufügen von Elementen zu einem Vektor:
Danke, ich denke so sollte es passen
Ich dachte ausgehend von Deinem Beispiel, daß Du die Koordinaten schon gerne in drei seperaten Variablen hättest. Deshalb mein Beispiel weiter oben.
@thefighter sagte in Hinzufügen von Elementen zu einem Vektor:
Das einzige was ich noch nicht weiß ist, was das zweite const hinter der Klammer bringt.
Dieses "zweite"
const
sagt aus, daß die Methode die Instanz nicht verändert (und auch nicht verändern darf). Dh. sie darf keine Member ändern und auch keine anderen non-const
Methoden aufrufen. Technisch gesagt,this
ist in solch einer Methode ein Zeiger aufconst T
.
-
@Swordfish sagte in Hinzufügen von Elementen zu einem Vektor:
Ich dachte ausgehend von Deinem Beispiel, daß Du die Koordinaten schon gerne in drei seperaten Variablen hättest. Deshalb mein Beispiel weiter oben.
Eigentlich schon, aber ich glaube an der Uni haben die noch C++ 14, dann schreibe ich es lieber so und dann ist halt eine Zeile mehr in der main().
Danke auf jeden Fall für deine Hilfe!
-
@thefighter sagte in Hinzufügen von Elementen zu einem Vektor:
an der Uni haben die noch C++ 14
Dann geht mein zweites Beispiel mit
std::tie()
. Das gibts seit C++11.
-
@thefighter sagte in Hinzufügen von Elementen zu einem Vektor:
So zum Beispiel, weiß aber nicht, ob man das auch mit Arrays machen kann
std::vector<double> const& cSpectrum::getSpec() const { return spec; }
OMG nein bitte nicht.
Bitte nichtstd::vector
für Vektoren mit kleiner und vor allem fixer Grösse verwenden. Das ist von der Performance her der Wahnsinn. Und auch unsauber, da ein 3D Vektor eine viel speziellere Semantik hat als einstd::vector
.Für sowas macht man eine Klasse
Vector3D
oder so. Für die kann man dann auch gleich die üblichen arithmetischen Operationen definieren sowie Hilfsfunktionen für weitere übliche Operationen (wie Kreuzprodukt, normalisieren) definieren.Bzw. gibt es passende Vektorklassen vermutlich auch fertig in etlichen Libraries.
Das einzige was ich noch nicht weiß ist, was das zweite const hinter der Klammer bringt.
Das bezieht sich auf den impliziten
this
Parameter den jede nicht-statische Memberfunktion hat.
-
@hustbaer : Ich glaube, du hast den falschen Beitrag zitiert, dadurch wirkt das mit dem vector etwas konfus.
-
@SeppJ Ich glaube du hast Recht Danke, fixed.
-
Dann ergänze ich noch, dass ein statisches Array hier zwar der technisch korrekte Datentyp ist, aus den von @hustbaer genannten Gründen, aber dass es nicht so recht rüber bringt, dass es sich hierbei um einen mathematischen Vektor handeln soll (Ich gehe mal davon aus, dass es ein mathematischer Vektor sein soll, nach dem, was ich sonst so sehe), weil ein Array nicht die Rechenoperationen mitbringt, die man mit einem mathematischen Vektor verbindet. Solche Rechenoperationen will man aber auch nicht als überladene Operatoren für alle
std::array
definieren, da das anderswo Arrays kaputt macht, die nicht als mathematische Vektoren gelten sollen. Und immer Funktionsaufrufe a lainner_product(a,b)
statta * b
zu schreiben ist auch doof.Also am besten eine neue Klasse dafür definieren, die dann intern gerne ein Array verwenden darf/sollte. Oder, wie @hustbaer auch schon empfohlen hat, eine fertige Lösung nehmen. Die gibt überall zu finden. Und die guten haben sogar nette Features wie z.B. ziemlich harte Optimierungen der Rechenoperationen, falls man viel damit rechnet. Bei Vektor- und Matrixrechnung kann man nämlich viel rausholen, wenn man sich genauer mit der Computertechnik auskennt.