unordered_map



  • Hallo!

    Ich arbeite zur Zeit mit der unordered_map aus (dem) TR1. Diese hat zwar den

    Tvalue & operator[] (const Tkey & Key)
    

    jedoch nicht auch noch in einer const-Version. So dass ich const Klassenreferenzen nicht verwenden kann.

    Kann ich nun ohne Probleme bei/mit der Vererbung eine neue Klasse erstellen, die von unordered_map erbt und den operator[] zusätzlich als const implementiert?

    // Zur Vereinfachung auf die vielen Template-Parameter verzeichtet
    class MyMap : public unordered_map<Tkey, Tvalue, ...>
    {
    public:
    
    // Die const-Version
    const Tvalue & operator [] (const Tkey & Key) const
    {
        // Implementation
    }
    };
    


  • Du würdest mit const-Indizierung aber die Semantik von Container Map (bzw. unordered-map) ändern. Durch den Index-Operator werden nämlich ein Key-Value-Paar erstellt, falls der angefragte Key noch nicht existiert... und damit kann die map nicht const sein.

    Insofern wenn, dann private Ableitung.



  • Oh, daran habe ich gar nicht gedacht.



  • Ich kenne die Map ausm TR1 nicht, aber in der stl::map ist der const-Zugriff mit "map::find" möglich. Ist hier evtl genauso?



  • Ja, ist möglich!



  • Pellaeon schrieb:

    Ich kenne die Map ausm TR1 nicht, aber in der stl::map ist der const-Zugriff mit "map::find" möglich. Ist hier evtl genauso?

    Hmm, also könnte ich dann den Operator mit unordered_map::find als const implementieren in der abgeleiteten Klasse.



  • Könntest du sicher, aber willst du wirklich die Logik verändern? Es gibt ja einen Unterschied. "operator[]" liefert mir IMMER ein Objekt (Exception-Fall mal ausgenommen). Wenn kein Objekt mit dem Schlüssel vorhanden ist, wird eins angelegt. "find" dagegen liefert end(), wenn der Schlüssel nicht existiert.



  • Pellaeon schrieb:

    Könntest du sicher, aber willst du wirklich die Logik verändern? Es gibt ja einen Unterschied. "operator[]" liefert mir IMMER ein Objekt (Exception-Fall mal ausgenommen). Wenn kein Objekt mit dem Schlüssel vorhanden ist, wird eins angelegt. "find" dagegen liefert end(), wenn der Schlüssel nicht existiert.

    Falls ich diesen Operator wirklich als const-Version bräuchte, werde ich ihn wohl mit find überladen. Falls find() dann end() liefert, werfe ich eine Ausnahme.

    Danke Euch.


Anmelden zum Antworten