const std::map<T,T> und der operator [] ?



  • Warum funktioniert der operator[] nicht auf const maps?
    Auf cppref finde ich keine gescheite Antwort dazu und nach const map zu suchen ist nicht so erfolgreich

    #include <map>
    int main()
    {
    std::map<double,int> g;
    g.insert(std::pair<double,int>(1,2));
    const std::map<double,int> cg = g;
    int gf = cg[1];
    }
    

    Eerror C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>' (or there is no acceptable conversion)



  • Ah, er ist nicht const, weil er neue Elemente einfügen kann, schon klar.

    Erledigt, danke 🙂



  • Seikilos schrieb:

    Warum funktioniert der operator[] nicht auf const maps?
    Auf cppref finde ich keine gescheite Antwort dazu und nach const map zu suchen ist nicht so erfolgreich

    #include <map>
    int main()
    {
    std::map<double,int> g;
    g.insert(std::pair<double,int>(1,2));
    const std::map<double,int> cg = g;
    int gf = cg[1];
    }
    

    Eerror C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>' (or there is no acceptable conversion)

    Weil Du über den operator den Zustand der Map ändern kannst. Er ist keine const-Methode.



  • Tachyon schrieb:

    Weil Du über den operator den Zustand der Map ändern kannst. Er ist keine const-Methode.

    Muesste es dafuer dann nicht eine ueberladene operator[]-Funktion geben, die dann statt einer Referenz eine konstante Referenz zurueckgibt? 😕

    Gruss
    Cartman



  • Laut Ref nicht, wäre aber schön 🙂



  • Eric Cartman schrieb:

    Tachyon schrieb:

    Weil Du über den operator den Zustand der Map ändern kannst. Er ist keine const-Methode.

    Muesste es dafuer dann nicht eine ueberladene operator[]-Funktion geben, die dann statt einer Referenz eine konstante Referenz zurueckgibt? 😕
    Gruss
    Cartman

    Die gibts deshalb nicht, weil map<>::operator[] bei Bedarf ein zusätzliches Key-Value-Paar in der Map anlegt, nämlich dann wenn der geforderte Key nicht vorhanden ist. Diese Neuanlage verändert die Map -> nicht const.



  • Ja und ne überladende könnte ja nur holen, ohne anlegen



  • pumuckl schrieb:

    Eric Cartman schrieb:

    Tachyon schrieb:

    Weil Du über den operator den Zustand der Map ändern kannst. Er ist keine const-Methode.

    Muesste es dafuer dann nicht eine ueberladene operator[]-Funktion geben, die dann statt einer Referenz eine konstante Referenz zurueckgibt? 😕
    Gruss
    Cartman

    Die gibts deshalb nicht, weil map<>::operator[] bei Bedarf ein zusätzliches Key-Value-Paar in der Map anlegt, nämlich dann wenn der geforderte Key nicht vorhanden ist. Diese Neuanlage verändert die Map -> nicht const.

    Klingt einleuchtend. Danke fuer die Aufklaerung.
    (muss zugeben, ich habe bis jetzt noch nicht mit der map gearbeitet)

    Gruss
    Cartman



  • Seikilos schrieb:

    Ja und ne überladende könnte ja nur holen, ohne anlegen

    Genau das dachte ich mir eben auch 🙂

    Gruss
    Cartman



  • meistens will man map::find() statt map::operator[]



  • Seikilos schrieb:

    Ja und ne überladende könnte ja nur holen, ohne anlegen

    und was soll der dann zurückgeben wenns den Key nicht gibt? Da bleibt nicht viel außer ner exception - und das Verhalten ist schnell selbst implementiert:

    template <class Key, class T, class Comp, class Alloc>
    std::map<Key,T,Comp,Alloc>::const_reference find_or_throw(std::map<Key,T,Comp,Alloc> const& m, Key const& k)
    {
       std::map<Key,T,Comp,Alloc>::const_iterator pos = m.find(k);
       if (pos == m.end()) throw DamnMyMapHasNotThatKeyException();
       else return *pos;
    }
    

Anmelden zum Antworten