Was in Container speichern?



  • Zeiger auf Objekte oder die Objekte?

    Also lieber

    vector<myclass> meinvector
    

    oder

    vector<myclass*> meinvector
    

    Ist das egal oder gibt es da eine Regel?

    MfG 😃



  • Nimm das, was deinen Anforderungen besser entspricht.
    Der Vorteil von Zeigern ist das schnellere Einfügen/Kopieren/Verschieben von Einträgen. Der Nachteil ist, dass man sich selbst um die Freigabe des Speichers kümmern muss.



  • die objekte selber ist einfacher und normalerweise vorzuziehen.
    wichtigste ausnahme: in die liste sollen objekte verscheidener typen, die zum glück ne gemeinsame basisklasse haben. dann kommen basisklassenzeiger in die liste.



  • volkard schrieb:

    die objekte selber ist einfacher und normalerweise vorzuziehen.
    wichtigste ausnahme: in die liste sollen objekte verscheidener typen, die zum glück ne gemeinsame basisklasse haben. dann kommen basisklassenzeiger in die liste.

    *vordenKopfschlag*

    du hast absolut Recht...zeiger nimmt man wenn man verschiedenartige Objekte hat!!!!

    THX!!!

    der Groschen ist gefallen 👍 👍

    aber ändert sich was am zugriff über Iteratoren oder bleibt das immer gleich??



  • Wenn du den operator-> benutzt, ändert sich nichts.



  • Nen Container ist halt nur nen ... Container ... nix weiter.

    Was du da rein packst, ist dein problem.
    Ob du zeiger oder das object selber nimmst, haengt von deiner Anforderung ab ...

    - Willst du polymorphie, also du willst nen Conatainer wo fische drin sind, und die fische sind mal nen Hai, nen rochen, nen Guppy ... dann bist sowieso an zeiger gebunden .

    - WIchtig zu wissen, das die objekte die du in den container reinpappst, kopiert werden !!! und je nach container nicht nur einmal. Also hasst du lange std::strings, die nicht von deinem container verwaltet werden, also besipielsweise nen subset aus nem anderen container, die aber sortiert, dann solltest nicht die strings selber, sondern zeiger drauf nehmen (erspart dir viel speicher und rechenleistung) .
    Alles was in container reinsoll (nicht per zeiger) , muss einen copy konstruktor haben (von dem auch viel gebraucht gemacht wird).

    Also klassen die keinen CCtor unterstuetzen (aus diversen gruenden) musst dann eh per zeiger einpflegen.

    Hoffe das hilft dich zu entscheiden ...

    Ciao ...



  • wenn ihr grad beim thema seid:
    Wie ist das bei Maps? Wenn ich jetzt z.B. n string als Key habe, dann kann ich ja nicht Zeiger speichern, weil dann ja einfach die adressen verglichen werden, nicht die strings selber. Muss man dann Strings speichern, oder könnte man das trotzdem mit Pointern machen, bespielsweise über irgendein Hilfsobjekt?
    geloescht



  • Warum solltest du darin denn string-Zeiger speichern?! Eine

    map<std::string, Value> Map;
    

    ist doch wunderbar!



  • Jo, denn string enthält selber schon Zeiger auf die eigentlichen Daten.



  • geloescht schrieb:

    Muss man dann Strings speichern, oder könnte man das trotzdem mit Pointern machen, bespielsweise über irgendein Hilfsobjekt?
    geloescht

    nicht hilfsobjekt, sondern vergleicher mitgeben.

    class stringzeigervergleicher
    {
       friend bool operator<(string const* a,string const* b)
       {
          return *a<*b;
       }
    };
    int main()
    {
       map<string,object,stringzeigervergeicher> mymap;
       ...
    

    und wer aufgepaßt hat, weiß bereits, daß das ansinnen durchaus legitim ist, zum beispiel für nen index.



  • Aha!
    Ich speichere nämlich den String zweimal (bidirektionale Zuordnung), aber es wäre blödsinnig zwei Kopien vom gleichen String zu speichern. Danke, ich werd den Vergleicher mal ausprobieren.
    geloescht


Anmelden zum Antworten