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 ein std::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 glaube C++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 auf const T.

    const-, volatile-, and ref-qualified member functions



  • @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 nicht std::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 ein std::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.


  • Mod

    @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.


  • Mod

    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 la inner_product(a,b) statt a * 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.


Anmelden zum Antworten