67 votes

Pourquoi std::map n’a pas un accesseur const ?

La déclaration de l’opérateur [] sur un std::map est la suivante :

Y a-t-il une raison que ce n’est pas cela ?

Parce que ce serait extrêmement utile n’importe quel moment vous devez accéder à une carte de membre dans une méthode const.

84voto

bamboon Points 7089

À partir de C ++11 il n’y a `` qui offre un accès const et non const.

Contrairement aux il lèvera un exception si l’élément n’est pas dans le plan.

80voto

Luchian Grigore Points 136646

operator[] dans une carte retourne la valeur de la clé spécifiée ou crée une nouvelle valeur initialisée élément clé si ce n'est pas déjà présent, de sorte qu'il serait impossible.

Si operator[] aurait un const de surcharge, l'ajout de l'élément ne fonctionne pas.

Qui répond à la question. Alternatives:

Pour C++03 - vous pouvez utiliser des itérateurs (ce sont des const et non-const couplé avec find). En C++11 , vous pouvez utiliser l' at méthode.

16voto

Cornstalks Points 9261

Ces réponses sont correctes dans cette operator[] a la sémantique pour ajouter une clé si elle n'existe pas, mais je voudrais ajouter un autre point de vue:

Remarquez comment operator[] renvoie un T&. C'est, il renvoie une référence à l' value qui est associé avec key. Mais que faire si il n'y a pas d' key dans la map? Ce qui devrait nous revenir? Il n'y a pas une telle chose comme un "null " référence" et de lancer une exception serait ennuyeux.

Ce serait une bonne raison pour ne operator[] const. Que voulez-vous retourner à l'utilisateur si vous ne pouvez pas ajouter quoi que ce soit à l' map (car l'opérateur est - const), mais ils sont à la recherche d'un élément qui n'existe pas? Une bonne solution à ce problème est de ne pas avoir l' operator[] const.

6voto

NPE Points 169956

La (non-const) operator[] crée la clé si elle n'existe pas.

L' const version de cet opérateur, si elle existait, devrait avoir des sémantiques différentes, car il ne serait pas en mesure d'ajouter une nouvelle clé.

Je suis sûr que vous seriez d'accord que la const et non-const surcharges avec significativement différente de la sémantique serait une boîte de pandore. Donc pas d' const version est fournie.

Il y a un const find() membre de bien que, de sorte que vous pouvez l'utiliser dans votre code.

4voto

eduffy Points 17061

Parce que la sémantique de `` sont à ajouter la clé si elle n’existe pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X