11
votes

Quelle est la signification du tableau associatif?

Je lis, je lis la bibliothèque standard C ++: un didacticiel et un livre de référence. Exemple de carte: xxx

L'auteur dit:

Ici, l'index est utilisé comme clé et peut avoir n'importe quel type. Ceci est l'interface d'un tableau associatif. Un tableau associatif est un tableau dans lequel l'indice peut être d'un type arbitraire .

Quelqu'un peut m'expliquer, quel type de type arbitraire dans une matrice associative?


3 commentaires

Cela signifie n'importe quel . Vous pouvez créer un std :: map qui utilise int comme clé, std :: string (comme dans votre exemple), ou même des instances de Des classes.


De Dictionary.com arbitraire: non attribué une valeur spécifique , fondamentalement, l'index peut être n'importe quoi; une corde, un entier, un objet ...


Je suppose / attendre / espérons que Josuttis a continué à expliquer les exigences imposées à ce type "arbitraire" ?


3 Réponses :


9
votes

Les matrices sont généralement indexées par la position des éléments. Un tableau simple - int x [10] , a ses éléments x [0] ... x [9] . L'index est une valeur intégrale non signée.

Le conteneur associatif signifie que l'index peut être, bien, un type arbitraire (pas nécessairement non signé) (dans ce cas, un std :: string ).


0 commentaires

2
votes

La distinction est entre les vecteurs / tableaux, que la plupart des gens appellent les conteneurs de séquence , mais qui peuvent être considérés comme les conteneurs associatifs avec les clés étant une gamme complète de nombres entiers de 0 à n.

D'autre part, les cartes ne placent pas une telle restriction sur les touches, elles peuvent être des chaînes, des entiers, tout type que vous souhaitez (à condition bien sûr qu'il existe un opérateur de comparaison sensible à l'égalité sur ce type).


5 commentaires

Eh bien, je ne considérerais pas les tableaux en tant que conteneurs associatifs indexés par des entiers: mappe [0] et et allouer deux objets, alors que c'est un comportement non défini à utiliser Vector [n] si n> vecteur.size.size () .


La sémantique de création automatique de la carte :: opérateur [] en C ++ a rien à faire avec la classification théorique des conteneurs de mon humble avis ...


Mon point (que vous partagez en disant "plage complète") est que vous ne pouvez pas utiliser une clé arbitraire avec un vecteur, seulement une séquence , donc je ne le considérerai pas comme un conteneur associatif.


Il associe des entiers à partir de cette plage avec des valeurs, vous pouvez donc le considérer comme un conteneur associatif IMHO. Je ne vois pas bien comment les entiers hors de portée entrent dans ce débat. Peut-être que nous devrons simplement accepter de ne pas être d'accord.


En effet, ma vision sur des conteneurs associatifs est sans contraintes sur les clés, mais je suis d'accord c'est juste mon opinion personnelle, merci de me laisser comprendre cela ;-)



2
votes

Cela signifie que vous pouvez créer une carte qui correspond à un type de clé arbitraire au type de valeur arbitraire.

Vous pouvez créer des cartes que map std :: chaîne s sur float s, court s sur yourclass ES ou YouotherClass à totanotherclass .

Vous pouvez même créer un std :: map qui pourrait mapper n'importe quel pointeur sur tout autre pointeur. Bien que cela soit utile douteux, car il n'y aurait aucun moyen de trouver le type de données que le pointeur pointe vers.


0 commentaires