Datentyp von Struktur...?



  • Hallo,
    ich hab da eine kleine Verständnisfrage und zwar:

    struct Struktur_1
    {
     int x;
     int y;
     int z;
    };
    
    struct Struktur_2
    {
     std::vector<Struktur_1> p_Struktur_1;
    };
    

    Nun, jetzt ist das zukünftige Array "p_Struktur_1" ja vom Datentyp "x, y, z". Bzw. 3 x Integer = 32+32+32 = 96.
    NUn frage ich mich, welchen Nutzen hat das? Und vorallendingen, wenn ich beispielsweise neue Elemente anlege:

    Struktur_2 struk_2;
    struk_2.push_back(20);
    

    Ich frage mich, was jetzt der Vorteil davon sein soll? Und welche Auswirkung hat das anlegen dieses Elemente's jetzt auf die jeweiligen beiden Strukturen?
    Ih könnte als Datentyp genau so gut schreiben:

    std::vector<int> p_Struktur_1;
    

    Hab das leider noch nicht so ganz verstanden...gibt es irgendwo Referenzen oder Spezifikationen dazu, dass ich mir das nacschlagen kann?

    Vielen lieben Dank im Voraus!
    Frohe Wheinachten! :xmas1:



  • Struktur_2 struk_2;
    struk_2.push_back(20);//Hast du es mal probiert? da fliegt dir ner Fehlermeldung
    
    std::vector<Struktur_2> struktur_vector;
    

    Bedeutet, wenn man jetzt mit Push_back arbeiten möchte, das man da keine Ints reinhauen kann sondern das man da Strukturen des Types Struktur_2 einfügen muss ungefähr so:

    struk_2.x = 100;
    struk_2.y = 100;
    struk_2.z = 100;
    struktur_vector.push_back(struk_2);
    


  • Ah, müssen die Variablennamen denn mit denen überweinstimmen, die man mit push_back wieder zurückgibt? Sprich, wenn oben in der Struktur x, y, z deklariert sind, müssen die Bezeichner dann auch x, y, z heissen, damit man die zurückgeben kann? Verstehe ich nicht ganz, sonst könnte man ja auch normale Integer-Werte übergeben.



  • Bitteschön:
    http://www.cplusplus.com/

    std::vector darfst du dir selber suchen.

    Aber ich denke mal, dass du den falsch verstanden hast.
    std::vector ist ein Container für einen beliebigen Datentypen (den du in den spizten Klammern angibst). Sprich der kann beliebig viele Instanzen dieses Types halten. Dann kannst du auch noch, wie bei einem Array per []-Operator auf die Elemente zugreifen. Hat aucht sonst noch viele Vorteile..

    Bei dir wäre das:

    std::vector<Struktur_1> p_Struktur_1;
    

    Noch leer, da du noch nichts eingefügt hast.

    Struktur_1 s1;
    s1.x = 2;
    s1.y = 3;
    s1.z = 5;
    p_Struktur_1.push_back ( s1 );
    

    p_Struktur_1 enthält jetzt genau ein Element vom Typen Struktur_1. Da kannst du jetzt z.B so darauf zugreifen:

    std::cout << p_Struktur_1[ 0 ].x; // 0 ist der Index für das erste Element
                                      // und da eine Instanz vom Tyen Struktur_1
                                      // zurückgegeben wird, kannst du die Member x auswählen.
    


  • Achso, ok. Zu dem letzten Codestück das du gepostet hast, würde man das Element nicht einfach so abrufen?

    p_Struktur_1[0]
    

    ?



  • Ja du rufst die Struktur ab, die am Index 0 steht. Aber um auf die elemente der Struktur zuzugreifen musst du logischer Weiße noch angeben welche Member also

    std::cout<<p_Struktur_1[0].x<<std::endl;
    std::cout<<p_Struktur_1[0].y<<std::endl;
    std::cout<<p_Struktur_1[0].z<<std::endl;
    


  • Sry wenn ich so viel Frage...
    Also kann man dann in diesem Falle nur die Instanzen aus der 1. Struktur mit push_back anlegen...?



  • wie-wo-was schrieb:

    Sry wenn ich so viel Frage...
    Also kann man dann in diesem Falle nur die Instanzen aus der 1. Struktur mit push_back anlegen...?

    Inwiefern "anlegen"?Du kannst soviele Instanzen der ersten Struktur "rein_push_backen()", soviel dein RAM hergibt 😛



  • wie-wo-was schrieb:

    Sry wenn ich so viel Frage...
    Also kann man dann in diesem Falle nur die Instanzen aus der 1. Struktur mit push_back anlegen...?

    Schau dir am besten einmal den Link, den ich gepostet habe in Ruhe an. (also unter std::vector) und dann google mal nach Beispielen, wenn du es immer noch nicht verstehst. Es gibt viele gute Tutorials, wo der Einstieg recht gut erklärt ist.



  • Nein, ich meinte eigentlich, dass man nur die Instanzen anlegen kann, sprich:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    struct struk_1
    {
    	int x;
    	int y;
    	int z;
    };
    
    struct struk_2
    {
    	vector<struk_1> p_struk_1;
    };
    
    int main(void)
    {
    	struk_1 s1;
    	struk_2 s2;
    
    	s1.x = 250;
    	s1.y = 500;
    	s2.z = 750;
    
    	cout<< s2.p_struk_1.push_back( s1.x ) <<endl;
    
    	cin.get();
    }
    

    und nicht:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    struct struk_1
    {
    	int x;
    	int y;
    	int z;
    };
    
    struct struk_2
    {
    	vector<struk_1> p_struk_1;
    };
    
    int main(void)
    {
    	struk_1 s1;
    	struk_2 s2;
    
    	int z = 250;
    	int y = 500;
    	int x = 750;
    
    	cout<< s2.p_struk_1.push_back( s1.x ) <<endl;
    
    	cin.get();
    }
    


  • Ich glaube du verwechselst da vollständig was
    Das hier:

    cout<< s2.p_struk_1.push_back( s1.x ) <<endl;
    

    funktioniert nicht. Da kriegst du eine Compilerfehlermeldung. Du willst in einen Vector einen int-Wert pushen, obwohl dein Vector eine struktur erwartet, das kann nicht gut gehen, stimmts oder?;)



  • struk_1 s1;
        struk_2 s2;
    
        int z = 250;
        int y = 500;
        int x = 750;
    

    Diese 5 Variablen haben rein gar nichts miteinander zu tun.

    z,y,x sind völlig unabhängige Variablen vom Typ Integer. Dass die gleich heissen, wie etwas in einer Klasse drin, spielt überaupt keine Rolle. (Ausser du deklarierst sie innerhalb einer Memberfunktion, wo sie die Memer dann einfach überdecken,aber das ist ein anderes Thema..)



  • oO...ähh 😞



  • Tut mir ja leid, aber jetzt bin ich verwirrt oO...
    Es wäre keiner so nett, mir ein minimales Beispiel zu tippen?



  • Haben wir doch.. 🙄

    Naja.

    std::vector<int> v; // vector von int's
    
    v.push_back ( 2 ); // pushe einen integer vom wert 2 rein
    v.push_back ( 3 ); // pushe einen integer vom wert 3 rein
    

    v hat nun 2 integer drin. Der erste hat den Wert 2, der zweite den Wert 3.

    Nun kannst du aber einen vector für einen beliebigen Typen erstellen:

    class foo{};
    
    std::vector<foo> foos;
    foos.push_back ( foo () ); // pushe ein foo in den vector, was auch immer das ist..
    

    Wenn du das immernoch nicht verstehst, dann sag wenigstens, was du nicht verstehst..



  • Ah, ich habs kapiert, danke schön! ❤ :xmas1: :xmas2:


Anmelden zum Antworten