vector richtig initalisieren



  • Hi.

    Möchte gerne ein Struct als Klasse umarbeiten und Methoden hinzufügen, habe jetzt aber schon mein erstes Problem. Mein Struct wird 1000 mal in einen vector abgelegt.

    struct mystruct
    {
    string text;
    }mystr;
    

    In der Klasse kann ich aber nicht mehr sagen vector<mydtruct> daten[1000];,
    sondern darf nur noch vector<mystruct> daten;

    Also habe ich im Konstruktor eine Schleife geschaffen die 1000 mal durchläuft und mittels daten.push_back(mystr); die 1000 Arrays erstellen soll.

    Wenn ich jetzt aber auf daten[0].text = "hello world!"; eingebe und mittels printf mir ausgeben lassen möchte, sagt er lediglich <null> als Ausgabe. Was mach ich denn falsch? Compiler meldet keine Fehler.



  • wie sieht die ausgabe aus?



  • Die Klasse vector<> hat auch einige Konstruktoren, die du verwenden darfst - vector<mystruct>daten(1000); sollte da eigentlich helfen.



  • @simon.gysi

    daten[0].text = "hello world!";
    printf("text: %s\n",daten[0].text);
    
    AUSGABE "text: <null>"
    

    @CStoll

    In einer Klasse kann ich aber nicht im public Bereich den vector bereits initialisieren, genausowenig wie dort int wert=1; funktioniert.

    P.S. oben habe ich mich vertippt, meinte natürlich statt der [1000] ein (1000)

    Ich bekomme es nicht hin, den vector in der Klasse bekannt zu machen und dann in einer Klasseninternen Funtkion wie dem Konstruktor "aufzufüllen". 😞



  • C-Strings kann man nicht direkt mit printf ausgeben.

    Wenn Du ohnehin C++ programmierst dann nimm einfach "cout << foo[0].text;".
    Oder (hässlich) Du übergibst foo[0].text.c_str() an printf.



  • Oh, btw, ein std::vector wächst bei push_back()s automatisch mit, Du brauchst die Kapazität also nicht unbedingt anzugeben.

    Wenn Du das machen möchtest, dafür aber nicht den Konstruktor verwenden willst, dann nimm einfach std::vector<T>::reserve. (siehe http://www.sgi.com/tech/stl/Vector.html)



  • Nanu schrieb:

    In einer Klasse kann ich aber nicht im public Bereich den vector bereits initialisieren, genausowenig wie dort int wert=1; funktioniert.

    Das sollst du ja auch in der Initialisierungsliste des Konstruktors machen.



  • Nanu schrieb:

    In einer Klasse kann ich aber nicht im public Bereich den vector bereits initialisieren, genausowenig wie dort int wert=1; funktioniert.

    Achso, der vector ist in einer anderen Klasse - dann mußt du ihn in deren Ctor initialisieren:

    class master
    {
      vector<mystruct>daten;
    public:
      master() : daten(1000) {}
    };
    

    Ich bekomme es nicht hin, den vector in der Klasse bekannt zu machen und dann in einer Klasseninternen Funtkion wie dem Konstruktor "aufzufüllen". 😞

    Entweder die Lösung von oben - oder du vergrößerst den vector mit resize() auf die richtige Größe, bevor du ihn füllst.



  • Oh, ich sehe erst jetzt, dass ich das Problem komplett missverstanden habe, sorry.



  • Danke für eure tolle Hilfe!

    In CBuilder ist das c_str() für AnsiString schon im Blut und normal bin ich auch gewohnt das sprintf bei strings eigentlich mir einen Fehler meldet. Jetzt klappts ja gott sei Dank.

    Kleine Zusatzfragen

    class master
    {
      vector<mystruct>daten;
    public:
      master() : daten(1000) {}
    };
    

    Das habe ich schomal gesehen, wirkt aber "seltsam" und was macht man wenn man mehrere vectoren hat? Dann muss man wohl eh den Weg wie oben gehen, oder?

    reserve() ist toll, setzt das den Inhalt eigentlich auch auf 0 oder muss man mit einer Schleife selber dann nochmal den vector durch und alle Variablen auf 0 setzen?



  • Nanu schrieb:

    Das habe ich schomal gesehen, wirkt aber "seltsam" und was macht man wenn man mehrere vectoren hat? Dann muss man wohl eh den Weg wie oben gehen, oder?

    Wenn du mehrere vectoren hast, geht das genauso - du mußt sie in der Initialisierungsliste (so nennt sich das ":daten(1000)") nur durch Komma getrennt angeben.

    reserve() ist toll, setzt das den Inhalt eigentlich auch auf 0 oder muss man mit einer Schleife selber dann nochmal den vector durch und alle Variablen auf 0 setzen?

    reserve() besorgt dem vector nur einen ausreichend großen Datenblock, füllt ihn aber nicht - danach auf die Elemente zugreifen zu wollen ist allerdings undefiniert.

    resize() oder der vector-Ctor füllen den vector mit der angegebenen Anzahl an Elementen - wenn nicht anders angegeben, werden die Elemente alle default-konstruiert. (du kannst noch einen zusätzlichen Parameter angeben, dann füllt sich der vector mit entsprechend vielen Kopien dieses Objekts)



  • Schön zu wissen, danke für die Erklärung!


Anmelden zum Antworten