Wie STL-Konstrukte verschachteln?



  • CStoll schrieb:

    Und vor allem, wie verwende ich Methoden wie erase? So wie find, also:

    mymap.find(1)->second.erase(2);
    

    Fast - erase erwartet keinen Schlüsselwert, sondern einen Iterator:

    mymap.find(1)->second.erase(mymap.find(1)->second.find(2));
    

    Danke für die Antworten.
    Laut SGI gibts für map aber auch ein erase mit key:

    size_type erase(const key_type& k)
    

    Ciao



  • Reth schrieb:

    Danke für die Antworten.
    Laut SGI gibts für map aber auch ein erase mit key:

    size_type erase(const key_type& k)
    

    Ciao

    Ups, stimmt ja, wie konnte ich den nur übersehen?
    😮 *im Boden versinkt*



  • Naja, die SGI-Doku ist aber für die SGI-STL, die sich von der ISO-C++ Standardlib an einigen Stellen unterscheiden kann. Will jetzt nicht sagen, das es in diesem Fall so ist, aber die SGI-Docu als Referenz heranzuziehen, kann auch ins Auge gehen. 😉



  • Artchi schrieb:

    Will jetzt nicht sagen, das es in diesem Fall so ist, aber die SGI-Docu als Referenz heranzuziehen, kann auch ins Auge gehen. 😉

    In dem Fall stimmt es aber überein - die erase(const key_type&) Methode gehört zum ANSI Standard (23.1.2).



  • Wo gibts denn ne gute Beschreibung des ANSI-/ISO-Standards der STL?

    Hier vielleicht:

    http://www.dinkumware.com/manuals/reader.aspx?lib=cpp

    ?



  • google dürfte sicher was dazu bringen 😉
    (ich hab's in Buchform zu Hause stehen - ein ziemlich dicker Wälzer btw)



  • Dinkumware ist schon ne gute Anlaufstelle. Ansonst ist die MSDN auch sehr informativ, vorallem hat sie auch Beispielcodes zu jedem Std-Lib-Thema.

    Ich pers. bevorzuge aber vernünftige Bücher aus Papier, z.B. das Buch von Kuhlins und Schrader -> super!



  • Buchtechnisch hab ich bisher Primer C++ und Thinking in C++ Volume 1.
    Nehm ich beide aber hauptsächlich als Nachschlagewerke, statt sie mal zu studieren.



  • Jetzt nochmal ne Frage zu verschachtelten Maps usw.:

    Muss ich bei sowas:

    map<int, map<int, MyObject *> > map;
    

    Zum Durchlaufen zwei verschachtelte For-Schleifen machen, die jeweils über einen Iterator der äußeren und einen der inneren Map laufen oder geht das auch anders?

    Und was geschieht denn, wenn ich Zeiger von MyObject in 2 Klassenvariablen, einmal in ne Map und einmal in nen Vector lege, da ich mal die eine, mal die andere Zugriffsart benötige, also z.B.:

    vector<MyObject *> vec;
    map<int, map<int, MyObject *> > map;
    ...
    

    Im Destruktor durchlaufe ich dann den Vector mit seinem Iterator und mache ein erase auf jeden Eintrag, da Objekte vom Typ MyObject zur Laufzeit dynamisch erzeugt und in beide Konstrukte eingetragen werden.

    Muss ich mich dann um die Maps auch noch kümmern, oder kann ich die ignorieren?

    Vielen Dank schon einmal, hoffe die Fragen sind nicht zu banal oder anfängermäßig!

    Ciao



  • Reth schrieb:

    Jetzt nochmal ne Frage zu verschachtelten Maps usw.:

    Muss ich bei sowas:

    map<int, map<int, MyObject *> > map;
    

    Zum Durchlaufen zwei verschachtelte For-Schleifen machen, die jeweils über einen Iterator der äußeren und einen der inneren Map laufen oder geht das auch anders?

    Ja, mußt du. (btw solltest du die Variable nicht "map" nennen, das gibt Konflikte mit dem gleichnamigen Typ ;))

    for(map<int,map<int,MyObject*> >::iterator outer=mymap.begin();outer!=mymap.end();++outer)
      for(map<int,MyObject*>::iterator inner=outer->second.begin();inner!=outer->second.end();++inner)
        print(*(inner->second));
    

    Und was geschieht denn, wenn ich Zeiger von MyObject in 2 Klassenvariablen, einmal in ne Map und einmal in nen Vector lege, da ich mal die eine, mal die andere Zugriffsart benötige, also z.B.:

    Dann mußt du das entsprechende Objekt trotzdem genau einmal löschen - und am besten dafür sorgen, daß der Zeiger aus beiden Containern gelöscht wird.

    Muss ich mich dann um die Maps auch noch kümmern, oder kann ich die ignorieren?

    delete brauchst du in der map nicht mehr - aber du mußt den Zeiger dort auch rauswerfen, wenn du das zugehörige Objekt demontiert hast.

    (eine bessere Alternative wäre es, boost::shared_ptr zu verwenden)



  • Vielen Dank für die Antworten!


Anmelden zum Antworten