Gibt es eine Methode at() in std::map?



  • Guten Abend zusammen,

    ich würde gerne folgendes machen

    string foo(const map<string,string>& m){
      return m.at("test");
    }
    

    und das wird vom gcc auch problemlos geschluckt.

    Allerdings bin ich etwas verwundert, daß ich im Standard keine entsprechende Methode gefunden habe.
    Habe ich nur schlecht gesucht?



  • Schau doch z.B. in der C++ Reference nach: http://www.cplusplus.com/reference/stl/map/

    Mein Compiler hat aber auch at() Ich kanns dir also nicht beantworten.



  • Naja, hier habe ich auch nichts gefunden. Aber ich arbeite immer ungeschützt (also operator[] ).

    MfG, EOutOfResources



  • http://ideone.com/OaCKQ
    Edit: @Vorposter: Falsch, operator [] kann auf eine const map nicht verwendet werden, der fügt nämlich ein.



  • EOutOfResources schrieb:

    Aber ich arbeite immer ungeschützt (also operator[] ).

    In der map<> ist der Index-Operator nicht wirklich "ungeschützt" - wenn du damit ein Element holst, das nicht existiert, wird es für dich angelegt (mit default-konstruiertem Wert).

    Eine Methode at() gibt es offiziell nur für vector<>, deque<> und basic_string<>, wo du darauf aufpassen mußt, ob du im gültigen Bereich zugreifst.



  • CStoll schrieb:

    EOutOfResources schrieb:

    wenn du damit ein Element holst, das nicht existiert, wird es für dich angelegt (mit default-konstruiertem Wert).

    Wusste ich nicht. Danke!



  • Mein Compiler (MSVC2010) hat für at() diese Implementation:

    #if _HAS_CPP0X
    	mapped_type& at(const key_type& _Keyval)
    		{	// find element matching _Keyval
    		iterator _Where = this->lower_bound(_Keyval);
    		if (_Where == this->end()
    			|| this->comp(_Keyval, this->_Key(_Where._Mynode())))
    			_Xout_of_range("invalid map<K, T> key");
    		return ((*_Where).second);
    		}
    
    	const mapped_type& at(const key_type& _Keyval) const
    		{	// find element matching _Keyval
    		const_iterator _Where = this->lower_bound(_Keyval);
    		if (_Where == this->end()
    			|| this->comp(_Keyval, this->_Key(_Where._Mynode())))
    			_Xout_of_range("invalid map<K, T> key");
    		return ((*_Where).second);
    		}
     #endif /* _HAS_CPP0X */
    

    Eventuell kommt es durch C++0x.



  • 314159265358979 schrieb:

    http://ideone.com/OaCKQ

    Danke 314159265358979!

    Ich war auf das Problem gestoßen, weil ich die (vermeintliche) exception von at() abfangen wollte.

    find() macht genau das, was ich will und ich brauche noch nicht einmal eine exception abfangen, sondern kann auf !end() testen.

    Im Nachhinein erscheint mir auch nachvollziehbar, warum die Methode nicht at() benannt wurde, denn die Semantik unterscheidet sich bei einem Nichttreffer ja doch sehr von vector::at().


Anmelden zum Antworten