Vektoren in Structs?



  • denial schrieb:

    Gibt es Alternativen?

    std::vector



  • Schlechter Scherz 😉



  • So schlecht, dass er schon wieder ernstgemeint ist 😉 Nein, mal im Ernst ...



  • Meines Wissens nach könnt man das mit einem puren Vector nich realisieren? Aber vielleicht ist einfach nich ganz klar, was ich überhaupt möchte...

    Ich möchte eine Struktur die nebst einem String-Vector noch mehrere andere Werte enthält (int, long...) als skalierbaren Array benutzen. Wie soll das mit einem Vector gehen?



  • struct A{
      vector<int>a;
      int b;
    };
    vector<A>a;
    


  • Du sollst statt irgendwelchem malloc/realloc-Gefrickel (der Speicher der da alloziert wird enthält Datenmüll, was für irgendwelche C-structs (auch POD genannt) OK ist, aber sensiblen Klassen wie vector direkt das Genick bricht) vector benutzen. Siehe Posting über mir.



  • Du sollst statt irgendwelchem malloc/realloc-Gefrickel (der Speicher der da alloziert wird enthält Datenmüll, was für irgendwelche C-structs (auch POD genannt) OK ist, aber sensiblen Klassen wie vector direkt das Genick bricht) vector benutzen. Siehe Posting über mir.
    

    Das check ich nun nicht. Meistens (Standard fordert es nicht aber hab noch kein Compiler gesehen beim dem dies nicht der Fall ist) ist:

    int*a=(int*)malloc(5*sizeof(int));
    

    gleich wertig zu

    int*a=new int[5];
    

    Die einzigen Unterschiede zwischen new und malloc, meines wissens nach, ist, dass das gecasts und gerechns weg fällt und, fals die Klasse ein Konstruktor hat, wird der Konstructor für diese Klasse aufgerufen. Der Unterschied zwischen free und delete ist dass, fals die Klasse einen Destruktor hat, dieser aufgerufen wird. Der Unterschied zwischen delete und delete[] ist, dass der Destruktor nur für das erste Object auf das der Pointer der du an es übergibst aufgerufen wird. delete[] sieht nach ob es weiter Objecte gibt und fals ja dann ruft es die Destruktoren auf. Der Speicher wird so oder so frei gegeben.

    Was du da mit Datemüll meinst ist mir nicht klar.



  • Achso, jetz hab ich das mit den Vectoren verstanden, ich wusste nicht, dass man auch benutzerdefinierte Strukturen als Typ eines Vektors verwenden kann. Nun noch eine kleine Frage.

    struct A{
      vector<int>a;
      int b;
    };
    vector<A>a;
    

    Bleiben wir mal bei dem Beispiel. Wenn ich nun zum Beispiel auf den dritten Eintrag des Vectors a zugreifen will (Bsp.: a[2].b=4) müsst ich ja vorher drei Einträge via push_back erstellt haben.

    a.push_back(...);
    a.push_back(...);
    a.push_back(...);
    

    Doch was übergebe ich als Argument für push_back? Der Typ is ja eine Struktur?



  • Irgendwer schrieb:

    Die einzigen Unterschiede zwischen new und malloc, meines wissens nach, ist, dass das gecasts und gerechns weg fällt und, fals die Klasse ein Konstruktor hat, wird der Konstructor für diese Klasse aufgerufen.

    Der letzte Nebensatz ist der entscheidende. Der Konstruktor wird bei malloc nicht aufgerufen. Ein Konstruktor verwandelt herumliegenden Speichermüll in ein lebendiges Objekt. Wenn er nicht aufgerufen wird, hast du eben nur Speichermüll.

    Ich frag mich jetzt natürlich, warum du das postest, wenn du es doch verstanden zu haben scheinst. Mal ins Blaue:

    class A {
      public: A(); // Konstruktor!
    };
    
    struct B {
      A a;
    };
    

    Preisfragen:

    1. hat B einen Konstruktor?
    2. was ist der Unterschied zwischen
    B *b = new B;
    // und
    B *b2 = (B*)malloc(sizeof(B));
    

    3. Das Icon mit der Glühbirne anklicken.



  • Das Icon mit der Glühbirne ist im Moment in Wartung... folglich verstehe ich deinen Code nicht ganz. Eine Klasse möchte ich nicht benutzen, ich will, den Code, wie es "Irgendwer" gezeigt hat, nutzen. Ich will nur wissen, wie ich den Vector initialisiere, damit ich auf bestimmte Fächer zugreifen kann. Meines Wissens nach, macht man das normalerweise mit push_back. Das Problem dabei? Siehe oben.



  • @denial
    DU wirst aber mit deinem Ansatz freuher oder spaeter in teufels kueche kommen, wenn nicht gar in der Programmierer - Hoelle schmoren (ich hoffe du kannst Doppelkopf oder Skat, ned das wir uns da unten zu sehr langweilen 😃 )

    Du solltest Dich entscheiden fuer C++ oder C . Ned von der Sprache her, aber vom Stil !

    Eine Klasse möchte ich nicht benutzen, ich will, den Code, wie es "Irgendwer" gezeigt hat, nutzen.

    Ueber dass solltest du noch mal tiefgruendiger nachdenken !!!

    Ja es gibt Situationen, wo man an bestimmte Strukturen gebunden ist. Wenn man die WinAPI befuellen muss, z.b. Aber es hindert einem keiner drann, ne Wrapperklasse zu schreiben, die einem die vorgegebenen Strukte verwaltet ??? und die man genau so benutzten kann wie das struct selber.
    Nur kann nen Wrapper dann noch etwas mehr, ist komfortabler, und vor allem du kannst deine structs konsistent halten, und Exceptionneutral. Versuch das mal mit nem halben C - Ansatz. Schau dir den Code dann hinterher mal an!!!

    Ich möchte eine Struktur die nebst einem String-Vector noch mehrere andere Werte enthält (int, long...) als skalierbaren Array benutzen.

    Ohne Klassen machst es Dir an der Stelle echt nur unnotig schwer !!!
    Nen Array unbestimmter groesse uninitialisiert aufzuziehen in dem du deinen aeusseren Vector(Array) Expandierst, ist auesserst unelegant !!!
    Also Warppe deine Strukturen mit ner Klasse, und quael dich ned unnoetig !

    Ciao ...



  • Hi

    Wobei dich natürlich keiner daran hindert deiner struct einen Konstruktor
    zu verpassen. Soviel ich weiss behandeln die meisten (wenn nicht alle)
    C++-Compiler eine struct intern als Klasse.

    Ciao



  • Soviel ich weiss behandeln die meisten (wenn nicht alle)

    Alle normale compiler! Das ist im Standard. Es gibt trotzdem 2 Unterschiede:

    1. alle struct member sind public (wenn du keine modifikatoren pritvate, public benutzest)
    struct  B: A {
    ...
    }
    

    ist egal zum:

    struct B: public A {
    }
    


  • Naja ich habs jetzt mit Struktur-Vektoren gelöst, und ich denke, so unelegant ist das nicht. Und wenn doch, sieht man sich eben in der besagten "Programmiererhölle" 😃

    Bye.



  • Das Icon mit der Glühbirne ist im Moment in Wartung... folglich verstehe ich deinen Code nicht ganz. Eine Klasse möchte ich nicht benutzen, ich will, den Code, wie es "Irgendwer" gezeigt hat, nutzen. Ich will nur wissen, wie ich den Vector initialisiere, damit ich auf bestimmte Fächer zugreifen kann. Meines Wissens nach, macht man das normalerweise mit push_back. Das Problem dabei? Siehe oben.

    Eigentlich hatte ich das schon mal geposted aber dieser Post schein ja verschwunden zu sein:

    struct A{
      vector<int> vec;
    };
    //...
    A a;
    vector<A>vec;
    vec.push_back(a);
    vec.push_back(a);
    vec.push_back(a);
    

    Wenn du 3 oder 4 schreibst benutzt du ja auch nur eine Instance des Types int.

    Alle normale compiler!

    Das normal kannst du wegstreichen, denn fals anders wird es nur von der Implementirung her schwere und ich glaub nicht, dass da jemand sich freiwillig das Leben schwerer macht.
    Und den 2ten Unterschied kannte ich noch nicht, danke.

    Ich frag mich jetzt natürlich, warum du das postest, wenn du es doch verstanden zu haben scheinst. Mal ins Blaue:

    Ich weis, dass ich es verstanden habe, ist schließlich nicht das erste mal das ich das jemandem erkläre 😉 . Nur bezeichne ich als Datenmüll das was nach dem Destruktor von der Klasse übrig bleibt und nicht was vor dem Konstuktor war. Das nenne ich uninitialisiert. Ist mir jetzt klar was du damit meinst.

    PS:irgenwie schein mich das Forum nicht zu mögen. Musste drei Mal neu auf "antwort schreiben" klicken damit ich auch ein Absenden Button erhalte 😞


Anmelden zum Antworten