vector mit struct auf heap



  • hallo zusammen,

    ich versuche gerade unter c++ auf dem heap einen vector mit struktur anzulegen, was eigentlich auch funktioniert.

    Ich verstehe jetzt nur nicht genau, wie ich die werte wieder ausgeben kann.

    soweit bin ich bis jetzt.

    es funktioniert alles bis auf die auskommentierte linie:

    #include <string>
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
     struct test {
    
    	int aa;
    	string bb;
    
     };
    
    int main(int argc, char* argv[])
    {
    
    	vector<test> rr;
    	vector<test>* v2;
    	test ab;
    
    	ab.aa = 5;
    	ab.bb = "asdasd";
    
    	rr.push_back(ab);
    
    	cout << rr[0].aa << "  " << rr[0].bb << endl;
    
    	v2 = new vector<test>;
    
    	v2->push_back(ab);
    	v2->push_back(ab);
    	v2->push_back(ab);
    
    	//cout << v2[0]->aa;
    
    	getchar();
    
    	return 0;
    }
    //---------------------------------------------------------------------------
    


  • cout << (*v2)[0].aa;
    

    EDIT:
    Erklärung ist vlt. auch nötig. 🙂

    Da v2 ein Zeiger ist, musst du ihn dereferenzieren, wenn du per [] - Operator darauf zugreifst. Anschliessend hast du ein Objekt test und kannst ganz einfach mit dem . - Operator auf die Elemente zugreifen.

    Btw:
    Es ist nicht nötig, dass DU den vector "auf dem Heap" erstellst. std::vector ist relativ intelligent. 😉



  • drakon schrieb:

    ...Btw:
    Es ist nicht nötig, dass DU den vector "auf dem Heap" erstellst. std::vector ist relativ intelligent. 😉

    Nochmal von mir wiederholt, weil es so wichtig ist. 👍 😃

    ... außerdem sollte man NIE das delete weglassen (ist genau wie das Blinken beim Abbiegen: Wenn man es zur Gewohnheit macht, fährt man sicherer).

    Gruß,

    Simon2.



  • preisfrage:
    wie kann ein vector dynamisch wachsen?



  • intern hat der vector( wenn er erzeugt wird) eine vordefinierte größe.
    Wenn man jetzt bspw. durch push_back neue elemente anfügt, und die max. Vorresrevierte größe ist erreicht, wird eine temporäre vector erzeugt mit bspw. doppelter größe als der aktuelle, die daten werden kopiert, und der referenz der neue vector verwiesen...



  • Hi Boris,

    da bist Du ziemlich sicher einer rhetorischen Frage auf den Leim gegangen. 😉

    quizmaster schrieb:

    preisfrage:
    wie kann ein vector dynamisch wachsen?

    Och, das kann man (in Grenzen) auch mit einem internen Stackvariablen machen... ich musste mal in meinen Anfangstagen auf der Arbeit eine "dynamische Speicherverwaltung auf Basis von Stack-Variablen" schreiben. Ist nicht schön, geht aber.

    Gruß,

    Simon2.

    P.S.: Wenn ich recht gesehen habe, gibt's nicht wenige std::string-Implementationen, die bis zu gewissen Stringlängen auch auf einer internen Stackvariable arbeiten....



  • Das interessiert mich aber. Kann mir unter internen Stackvariable jetzt nicht so viel vorstellen.
    Kannst bitte ein kleines Beispiel machen?



  • Bei std::string gibts z.B. impl. die bei weniger als 8 Zeichen, ein char data[8] verwenden, jedoch bei mehr zeichen ein char* pData = new char[...] anlegen.
    (Die 8 char von data sind dann verschwendet und leer...)

    Simon



  • @ganz oben^^:

    wenn du vielleicht dein test-struct komplett ausgeben lassen willst,
    dann kannst du ja eine globale Funktion schreiben, die den Shift-Operator "<<" überläd, wie folgt:

    ostream & operator<<(ostream & out, const test t)
    {
        out << t.aa << " " << t.bb;
        return out;
    }
    

    Der Vorteil ist folgender:
    Anstelle von cout << (*v2)[0].aa; bzw cout << (*v2)[0].bb; brauchst du nur

    cout << (*v2)[0]; zu schreiben^^
    

Anmelden zum Antworten