J'ai essayé d'utiliser l'opérateur [] pour accéder à l'élément dans une carte const C++, mais cette méthode a échoué. J'ai également essayé d'utiliser "at ()" pour faire la même chose. Cela a fonctionné cette fois. Cependant, je n'ai trouvé aucune référence sur l'utilisation de "at ()" pour accéder à l'élément dans une carte const C++. "At ()" est-elle une fonction nouvellement ajoutée dans la carte C++? Où puis-je trouver plus d'informations à ce sujet? Merci beaucoup!
Un exemple pourrait être le suivant:
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int, char> A;
A[1] = 'b';
A[3] = 'c';
const map<int, char> B = A;
cout << B.at(3) << endl; // it works
cout << B[3] << endl; // it does not work
}
Pour utiliser "B [3]", il a renvoyé les erreurs suivantes lors de la compilation:
t01.cpp: 14: erreur: passage de 'const std :: map, std :: allocator>>' comme 'cet' argument de '_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] ( const _Key &) [with _Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: allocator>] 'supprime les qualificatifs
Le compilateur utilisé est g ++ 4.2.1
at()
est une nouvelle méthode pour std::map
en C++ 11.
Plutôt que d'insérer un nouvel élément construit par défaut comme operator[]
Le fait si un élément avec la clé donnée n'existe pas, il lève une exception std::out_of_range
. (Ceci est similaire au comportement de at()
pour deque
et vector
.)
En raison de ce comportement, il est logique qu'il y ait une surcharge const
de at()
, contrairement à operator[]
Qui a toujours le potentiel de changer la carte.
Si un élément n'existe pas dans un map
, le operator []
l'ajoutera - ce qui ne peut évidemment pas fonctionner dans une carte const
donc C++ le fait pas définir une version const
de l'opérateur. Ceci est un bel exemple du vérificateur de type du compilateur empêchant une erreur d'exécution potentielle.
Dans votre cas, vous devez utiliser à la place find
qui renverra uniquement un (itérateur vers le) s'il existe, il ne modifiera jamais le map
. Si un élément n'existe pas, il renvoie un itérateur dans la end()
de la carte.
at
n'existe pas et ne devrait même pas être compilé. Il s'agit peut-être d'une "extension de compilateur" (= un bug nouveau en C++ 0x).
L'opérateur [] créera une nouvelle entrée dans la carte si la clé donnée n'existe pas. Cela peut donc changer la carte.
Voir ceci lien .
Cela m'étonne assez, mais la carte STL n'a pas d'opérateur d'index const
. Autrement dit, B[3]
Ne peut pas être en lecture seule. Du manuel:
Je n'ai aucune idée de at()
.