structure de données de paires dictionnaire / carte / clé-valeur en C

Comment construire et accéder à un ensemble de paires clé-valeur en C? Pour utiliser un exemple simple stupide, disons que je veux créer une table qui traduise entre un entier et sa racine carrée.

Si j’écrivais javascript, je pourrais simplement faire ceci:

var squareRoots = { 4: 2, 9: 3, 16: 4, 25: 5 } 

puis accédez-y comme:

 var squareRootOf25 = squareRoots[5] 

Quelle est la plus jolie façon de faire cela en C? Et si je veux utiliser un type d’énum comme clé et un autre type d’énum comme valeur?

Pour cela, vous pouvez envisager une implémentation de hachage en langage C. Pour les bases du hash, reportez-vous à Wikipedia . Reportez-vous à cette question pour plus de détails et de liens.

Ce lien donne une bonne vue d’ensemble et des détails de mise en œuvre.

Il n’y a pas de moyen intégré de faire cela à moins de compter l’initialisation d’un tableau comme celui-ci dans C99:

 double squareRoots[] = { [4] = 2.0, [9] = 3.0, [16] = 4.0, [25] = 5.0, }; 

Cependant, cela alloue 26 éléments dans le tableau; les autres valeurs sont toutes des zéros.

En supposant que vous ne vouliez pas dire cela, alors examinez C Interfaces and Implementations de DR Hanson; cela montre une manière de mettre en place des tableaux associatifs (aussi appelés hachages ou dictionnaires).

Vous pouvez également utiliser le libghthash pour les hachages à usage général. Ils sont assez faciles à utiliser et à intégrer dans votre application. Cependant, il s’agit d’une API tierce. Si cela pose un problème, vous devez mettre en œuvre la vôtre.

Il n’y a pas de tableau associé d’assemblage / tables de hachage en C.

L’initialisation du tableau (C99) est probablement la meilleure solution sauf si vous avez des clés non numériques:

 T hash[] = { [1] = tObj, [255] = tObj2, }; 

Vous pouvez utiliser map implémenté dans la bibliothèque clib