85 votes

Quelle est la différence entre const et non const clé?

Quelle est la différence entre les deux lignes suivantes?

map<int, float> map_data;
map<const int, float> map_data;

72voto

Lightness Races in Orbit Points 122793
  • int et const int sont de deux types distincts.

  • std::map<int, float> et std::map<const int, float> sont, de même, différents types.

La différence entre std::map<const int, float> et std::map<int, float> est, à un degré, analogue à la différence entre, disons, std::map<int, float> et std::map<std::string, float>; vous procurer un nouveau type de carte pour chaque.

Dans le non-const des cas, le type de clé est toujours non-const int:

std::map<const int, float>::key_type       => const int
std::map<int, float>::key_type             => int

Cependant, la carte touches sont sémantiquement immuable, et tous les carte des opérations qui permettent d'accéder directement à des touches (par exemple, un déréférencement des itérateurs, qui rendements en value_type) n' constidentifier l' key_type:

std::map<const int, float>::value_type => std::pair<const int, float>
std::map<int, float>::value_type       => std::pair<const int, float>

Donc, la différence peut être en grande partie invisible pour vous dans tous les sens, si votre application le permet.

Ce n'est pas toujours le cas: la norme officiellement nécessite votre type de clé pour être copiable et mobile, et certaines implémentations de ré-carte d'utilisation des nœuds; en vertu de ces implémentations, essayez d'utiliser un const clé ne fonctionnera pas.

37voto

Maroun Maroun Points 31217

La clé est déjà const, de sorte qu'il est superflu d'écrire const dans ce cas. Une fois qu'un élément est entré, son key ne peut pas être modifié.


Edit:

Comme mentionné dans les commentaires, il y est de différence entre les deux lignes. Par exemple, si vous écrivez une fonction qui accepte map<const int, int>, vous ne pouvez pas passer à il map<int, int> car ils sont de différents types.

Mais notez que, même s'ils sont de types différents, ils se comportent de la même puisque la clé dans une carte est un const de toute façon...

Donc, en conclusion.. La seule différence est qu'ils sont de deux types différents, vous ne devriez pas vous soucier de rien d'autre.

9voto

AndreyT Points 139512

La différence est que la seconde variante va définir le type de clé pour la carte const int. De la "le caractère modifiable" point de vue c'est redondant, car la carte déjà stocke ses touches const objets.

Toutefois, cela peut également conduire à l'inattendu et de la non-évidence des différences dans le comportement de ces deux cartes. En C++ d'un modèle de spécialisation écrit pour le type T est différente de la spécialisation écrit pour le type const T. Cela signifie que les deux versions de la carte pourriez finir vers le haut à l'aide de différentes spécialisations des différents "satellite" des modèles qui dépendent du type de clé. Un exemple en est la clé comparateur de prédicat. Le premier utilisera std::less<int> , alors que le second utilisera std::less<const int>. Par l'exploitation de cette différence, vous pouvez facilement faire ces cartes pour le tri de leurs éléments dans un ordre différent.

Des questions comme la plus évidente avec le nouveau C++11 conteneurs comme std::unordered_map. std::unordered_map<const int, int> ne sera même pas compiler, car il va tenter d'utiliser un std::hash<const int> spécialisation pour le hachage de l'clés. Cette spécialisation n'existe pas dans la bibliothèque standard.

3voto

const ne peuvent pas être modifiés une fois définie. Et oui comme par docs & autre réponse, vous devriez vous rappeler que key est const déjà.

Lien: http://www.cplusplus.com/reference/map/map/ Lien: http://en.cppreference.com/w/cpp/container/map

2voto

blgt Points 3325

Alors que le comportement de votre application sera généralement le même, il fait une différence pour certains compilateurs que vous pourriez utiliser. L'exemple plus spécifique de ce qui m'a amené vers cette page en premier lieu:

Spécifiant explicitement une carte en map<const key, value> construit avec succès avec la gnu boîte à outils;

Cependant, il se bloque sur un Studio12 Solaris x86 construire.


map<key, value> s'appuie avec succès sur les deux. Le comportement de l'application est inchangé.

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