Quelle est la différence entre les deux lignes suivantes?
map<int, float> map_data;
map<const int, float> map_data;
Quelle est la différence entre les deux lignes suivantes?
map<int, float> map_data;
map<const int, float> map_data;
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' const
identifier 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.
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é.
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.
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.
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
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 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.