Ich habe versucht, herauszufinden, wie man einen Wert aus einer Map in einer const-Methode zurückgibt, und stolperte über die Methode at () für map in gcc 4.6.
Als ich das nachgesehen habe, habe ich gemerkt, dass es nicht Standard ist:
Der C ++ Map Access verwirft Qualifier (const)
Aber es ist sicherlich viel weniger wortreich als der Ansatz find (). Ich habe mich gefragt, ob das C ++ 11 das behoben hat - ist at () für Map Teil des neuen Standards?
Ja. std::map
hat eine at
-Memberfunktion in C ++ 11 mit der folgenden Spezifikation (23.4.4.3/9):
%Vor%Rückgabe: Ein Verweis auf den zugeordneten Typ, der
x
in*this
entspricht.Auslöser: Ein Ausnahme-Objekt vom Typ
out_of_range
, wenn kein solches Element vorhanden ist.Komplexität: logarithmisch.
Beachten Sie jedoch, dass diese Elementfunktion speziell zu std::map
hinzugefügt wurde. Dies ist für die allgemeinere assoziative Container -Anforderung nicht erforderlich. Wenn Sie generischen Code schreiben, der einen assoziativen Containertyp benötigt, können Sie diesen neuen at
nicht verwenden. Stattdessen sollten Sie weiterhin find
, das Teil des assoziativen Containers -Konzepts ist, verwenden oder einen eigenen Nichtmitgliedshelfer schreiben:
Oder, wenn Sie eine Implementierung haben, die rvalue-Referenzen und decltype
unterstützt, brauchen Sie keine zwei Überladungen:
(Oder etwas in der Nähe davon; ein Spaß an C ++ 11 ist, dass keine zwei Compiler die gleichen Fehler haben und alle etwas unterschiedliche Teilmengen von gültigem - und ungültigem - C ++ 11 Code zu akzeptieren scheinen.)