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 aussi 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-il 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: passer 'const std :: map, std :: allocator>>' comme 'this' argument de '_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] ( const _Key &) [with _Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: allocator>] 'ignore les qualificatifs
Le compilateur utilisé est g ++ 4.2.1
at()
avec dans VS2013 sur un projet configuré pour utiliser la boîte à outils VS2010. Je pensais que cela signifiait que je n'utilisais pas C ++ 11 ... Mais pourtant, il compile ... ??Si un élément n'existe pas dans a
map
, leoperator []
ajoutera - ce qui ne peut évidemment pas fonctionner dans uneconst
carte, donc C ++ ne définit pas deconst
version 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
find
place qui ne renverra un (itérateur à l'élément) que s'il existe, il ne modifiera jamais lemap
. Si un élément n'existe pas, il renvoie un itérateur sur celui de la carteend()
.at
n'existe pas et ne devrait même pas compiler. Peut-être s'agit-il d'une «extension de compilateur» (=un bugnouveau dans C ++ 0x).la source
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 ce lien .
la source
Cela me surprend, mais la carte STL n'a pas d'
const
opérateur d'index. Autrement dit,B[3]
ne peut pas être en lecture seule. À partir du manuel:Puisque l'opérateur [] peut insérer un nouvel élément dans la carte, il ne peut pas s'agir d'une fonction membre const.
Je n'en ai aucune idée
at()
.la source