Hinzufügen von Elementen zu einem Vektor
-
@Jockelx sagte in Hinzufügen von Elementen zu einem Vektor:
Visual-Studio sicherlich auch per checkbox ausschaltbar.
Nicht im "Add Class" Dialog selbst. Auch sonst habe ich keine Konfigurationsmöglichkeit dafür gefunden.
Man kann höchstens die Klasse erst mit "Add Class" erzeugen lassen und danach mit dem "Class Wizzard" bearbeiten. Und selst damit werden Methoden die man löscht nur zeilenweise auskommentiert. duh.
Alles umständlicher als den default-ctor und den dtor einfach per Hand zu löschen.
-
Ich verwende den ollen Add-Class Wizard nie. Wozu sollte ich auch? Weil es so schwer ist sich zu merken wie man
#pragma once class Foo { public: };
mit Hand schreibt?
Bei Framework-Zeugs ala ATL, MFC & Co. ist das was anderes, aber da liefert der Wizard auch meist keinen kompletten Schmarrn ab.
-
@hustbaer sagte in Hinzufügen von Elementen zu einem Vektor:
Ich verwende den ollen Add-Class Wizard nie. Wozu sollte ich auch?
Das.
-
Ich hab den Wizard auch noch nie verwendet. Der macht noch mehr Quatsch, z.B. void Parameter.
-
@Swordfish sagte in Hinzufügen von Elementen zu einem Vektor:
@Jockelx sagte in Hinzufügen von Elementen zu einem Vektor:
Visual-Studio sicherlich auch per checkbox ausschaltbar.
Nicht im "Add Class" Dialog selbst. Auch sonst habe ich keine Konfigurationsmöglichkeit dafür gefunden.
Hab ich mich mit meinem "sicherlich" echt zu weit aus dem Fenster gelehnt!?
Schliesse mich aber dem Rest an: Brauch eh kein Mensch, diesen Dialog.
-
@Jockelx sagte in Hinzufügen von Elementen zu einem Vektor:
Hab ich mich mit meinem "sicherlich" echt zu weit aus dem Fenster gelehnt!?
Daß ich mal eine Einstellung in VS nicht finde die es aber gibt ... ja, kann sein. Glaub' ich in diesem Fall aber nicht.
@Jockelx sagte in Hinzufügen von Elementen zu einem Vektor:
Schliesse mich aber dem Rest an: Brauch eh kein Mensch, diesen Dialog.
-
Achso nochmal ein wenig was anderes, unser Professor hat uns Getter und Setter so beigebracht:
void Particle::getPosition(double & x, double & y, double & z) { x = p[0]; y = p[1]; z = p[2]; } void Particle::setPosition(const double & x, const double & y, const double & z) { p[0] = x; p[1] = y; p[2] = z; }
Würde es gerade bei den Gettern aber schöner finden, wenn das Array im Rückgabewert stehen würde. Macht man das in C++ immer so, oder gibt es da bessere Wege?
-
wie würdest du denn sonst drei werte zurück geben wollen?
-
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.