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
CartmanDie 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
CartmanDie 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; }