web-dev-qa-db-fra.com

Accès aux éléments de carte const C ++

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

85
icephere

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.

108
CB Bailey

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).

32
Konrad Rudolph

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 .

3
vidstige

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:

Puisque l'opérateur [] peut insérer un nouvel élément dans la carte, il ne peut pas être une fonction membre const.

Je n'ai aucune idée de at().

2
Beta