example Accès à l'élément de carte C++ const




map c++ (4)

J'ai essayé d'utiliser l'opérateur [] 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 ++. Est-ce que "at ()" est une fonction nouvellement ajoutée dans la map 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: en passant 'const std :: map, std :: allocateur>>' comme 'cet' argument de '_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] ( const _Key &) [avec _Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: allocateur>] 'rejette les qualificatifs

Le compilateur utilisé est g ++ 4.2.1


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


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 le fait l' operator[] 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 une map , l' operator [] va l'ajouter - ce qui ne peut évidemment pas fonctionner dans une carte const , donc C ++ ne définit pas une version const de l'opérateur. C'est un bon exemple de vérificateur de type du compilateur qui empêche une erreur d'exécution potentielle.

Dans votre cas, vous devez utiliser find place qui ne retournera qu'un élément (itérateur de l'élément) s'il existe, il ne modifiera jamais la map . Si un élément n'existe pas, il renvoie un itérateur à la end() la carte end() .

at n'existe pas et ne devrait même pas compiler. C'est peut-être une "extension de compilateur" (= un bug nouveau en C ++ 0x).






const