Quelle est la signification de tableau associatif?
Je suis en train de lire Le C++ Standard Library: Un Tutoriel et ouvrage de Référence. Dans la carte exemple:
typedef map<string,float> StringFloatMap;
StringFloatMap coll;
//insert some elements into the collection
coll["VAT"] = 0.15;
coll["Pi"] = 3.1415;
coll["an arbitrary number"] = 4983.223;
coll["Null"] = 0;
L'auteur de dire:
Ici, l'index est utilisé comme clé et peut avoir n'importe quel type. C'est l'interface d'un tableau associatif. Un tableau associatif est un tableau dont l'index peut être d'une type arbitraire.
Un pouvait m'expliquer, ce que type arbitraire signifie dans le tableau associatif?
Il signifie aucun. Vous pouvez créer un
À partir de dictionary.com
Je suppose/attendre/espérer que Josuttis est allé expliquer les exigences imposées sur ce "arbitraire" type?
std::map
qui utilise int
clés, std::string
(comme dans votre exemple), ou même des instances de classes.À partir de dictionary.com
arbitrary: not assigned a specific value
, fondamentalement, l'indice peut être n'importe quoi; une chaîne de caractères, un entier, un objet...Je suppose/attendre/espérer que Josuttis est allé expliquer les exigences imposées sur ce "arbitraire" type?
OriginalL'auteur Milad Khajavi | 2013-03-06
Vous devez vous connecter pour publier un commentaire.
Les tableaux sont généralement indexés par la position des éléments. Un tableau simple -
int x[10]
, a ses élémentsx[0] ... x[9]
. L'indice est un entier non signé valeur intégrale.Le conteneur associatif signifie que l'indice peut être, ainsi, un arbitraire (pas nécessairement un entier non signé (intégrale) type (dans ce cas, un
std::string
).OriginalL'auteur Luchian Grigore
La distinction entre les vecteurs/matrices, dont la plupart des gens appellent conteneurs de séquence, mais qui peut en fait être considérée comme conteneurs associatifs avec les clés de la gamme complète des entiers allant de 0 à N.
Sur l'autre main, les cartes ne placez pas une telle restriction sur les touches, ils peuvent être des chaînes de caractères, entiers, le type que vous voulez (à condition bien sûr qu'il est sensible à l'égalité opérateur de comparaison sur ce type).
map[0]
etmap[1000]
allouer deux objets, alors que c'est un comportement indéfini à utiliservector[n]
sin > vector.size()
.La création automatique de la sémantique de la carte::operator[] en C++ rien à voir avec la classification théorique des conteneurs à mon humble avis...
Mon point de vue (que vous partagez en disant: "gamme complète"), c'est que vous ne pouvez pas utiliser un arbitraire avec un vecteur, seulement un ordre, donc je ne considère pas ça comme un conteneur associatif.
Il associe des nombres entiers à partir de cette gamme de valeurs, par conséquent, vous pouvez le considérer comme un conteneur associatif à mon humble avis. Je n'arrive pas à voir comment les entiers de gamme viennent dans ce débat. Peut-être que nous devrons accepter d'être en désaccord.
En effet, ma vision sur les conteneurs associatifs est sans contraintes sur les touches, mais je suis d'accord c'est juste mon opinion personnelle, merci de me le faire comprendre 😉
OriginalL'auteur us2012
Cela signifie que vous pouvez créer une carte qui correspond à l'arbitraire d'un type de clé à l'arbitraire type de valeur.
Vous pouvez créer des cartes dont la carte
std::string
s àfloat
s,short
s àYourClass
es ouYourOtherClass
àYetAnotherClass
.Vous pourriez même créer un
std::map<void *, void *>
qui pourrait correspondre à un pointeur vers tout autre pointeur. Bien que ce serait de l'utilisation douteuse, car il n'y aurait pas moyen de trouver le type de données que le pointeur pointe.OriginalL'auteur Philipp