Fragen zur STL Map



  • Hallo allerseits,

    da C++ noch immer Neuland für mich ist und ich mich gerade in die STL einarbeite, stosse ich imemr wieder auf Probleme.
    So auch jetzt, ich möchte Objekte meiner Klasse mit int als Schlüssel in eine Map eintragen.

    Meine Klasse ist nicht besonders gebaut, habe aber auch keinen Copykonstruktor selbst angelegt (und auch keinen Defaultkonstruktor, glaub).

    Nun wollte ich eine Map dieser Art anlegen:

    map<int, MyClass&> myClassMap;
    

    Wenn ich dies versuche, bekomme ich vom GCC zig Fehlermeldungen, die sich auf map und pair beziehen.
    Meine Frage nun: Kann man in einer Map (bzw. in einem Container) keine Referenzen ablegen?
    Sind Referenzen assignable (hab dazu in meinen Büchern gewühlt, dort wurde zwar assignable erklärt, aber leider nicht im Zshg. mit Referenzen)?
    Welche Bedingungen muss meine Klasse erfüllen, damit ich sie mit Hilfe von int-Schlüsseln in ner Map ablegen kann?

    Bin auch für gute Links hinsichtlich STL und C++ Beispielen dankbar!

    Danke schon einmal!

    Ciao



  • Reth schrieb:

    Hallo allerseits,

    da C++ noch immer Neuland für mich ist und ich mich gerade in die STL einarbeite, stosse ich imemr wieder auf Probleme.
    So auch jetzt, ich möchte Objekte meiner Klasse mit int als Schlüssel in eine Map eintragen.

    Meine Klasse ist nicht besonders gebaut, habe aber auch keinen Copykonstruktor selbst angelegt (und auch keinen Defaultkonstruktor, glaub).

    Wenn du selber keinen Copy-Ctor anlegst, baut dir der Compiler einen 😉

    Nun wollte ich eine Map dieser Art anlegen:

    map<int, MyClass&> myClassMap;
    

    Wenn ich dies versuche, bekomme ich vom GCC zig Fehlermeldungen, die sich auf map und pair beziehen.
    Meine Frage nun: Kann man in einer Map (bzw. in einem Container) keine Referenzen ablegen?

    Nein, kannst du nicht. Dazu müsstest du in der Lage sein, die Referenz umzubiegen.

    Sind Referenzen assignable (hab dazu in meinen Büchern gewühlt, dort wurde zwar assignable erklärt, aber leider nicht im Zshg. mit Referenzen)?

    Nein. (die Referenz wird bei der Erzeugung mit einer Adresse belegt und kann anschließend nie wieder woanders hingebogen werden - alle weiteren Zugriffe leitet sie an die Variable hinter dieser Adresse weiter)

    Welche Bedingungen muss meine Klasse erfüllen, damit ich sie mit Hilfe von int-Schlüsseln in ner Map ablegen kann?

    Afaik muß sie kopierbar (Copy-Ctor und op=) und Default-konstruierbar (Default-Ctor) sein.
    (bin mir aber nicht sicher)

    PS: Wenn du aus irgendeinem Grund keine Objekte direkt speichern willst, pack lieber Pointer in deine Map.



  • Danke für die Antwort!

    Pointer wären meine nächste Wahl gewesen, da ich keine Objekte speichern will, aber in C++ eigentlich auch Zeiger umgehen wollte.

    Ich dachte immer nur ne const Referenz wäre unveränderlich?!

    Ciao



  • Reth schrieb:

    Ich dachte immer nur ne const Referenz wäre unveränderlich?!

    Der Unterschied zwischen einer read-only Referenz und einer Read and Write Referenze ist lediglich der, dass du auf den referenzierten Wert bei einer read-only Referenz nicht schreiben kannst.

    Gruß Caipi



  • map<int, boost::shared_ptr<MyClass> > myClassMap;
    


  • volkart schrieb:

    map<int, boost::shared_ptr<MyClass> > myClassMap;
    

    Was ist das denn? Shared Pointers hab ich glaub schon mal gehört.
    Bringt das hier einen Performancegewinn gegenüber:

    map<int, MyClass*> myClassMap;
    

    ?
    Ist boost:: ein Standardpaket (also auch beim GCC dabei)?

    Ciao



  • Reth schrieb:

    volkart schrieb:

    map<int, boost::shared_ptr<MyClass> > myClassMap;
    

    Was ist das denn? Shared Pointers hab ich glaub schon mal gehört.
    Bringt das hier einen Performancegewinn gegenüber:

    Infos zu boost.shared_ptr.

    Ist boost:: ein Standardpaket

    Nope. Dann wäre es im namespace std:: :p 😉
    Auch wenn sie (noch) nicht offiziell zu den C++-Standard-Bibliotheken zählen, stellen die Boost-Libraries die Funktionalität wie z.B. erweitertes Dateihandling, Threads, etc. bereit die in der Standardbibliothek derzeit vermisst wird. Da dies alles auch noch portabel ist, ist es meine erste Wahl, wenn die Standardlibrary von C++ "versagt".

    Gruß Caipi



  • @Caipi

    Danke für die Infos!
    Hab mal reingelinst, die SmartPointers lesen sich ja toll!

    Ciao


Anmelden zum Antworten