C:
Использование ассоциативных массивов
Как это сделать:
C не имеет встроенной поддержки ассоциативных массивов, как некоторые языки высокого уровня, но вы можете симулировать их, используя структуры и хеширование. Ниже приводится простой пример с использованием комбинации структуры и простой хеш-функции для реализации ассоциативного массива для хранения и доступа к целым числам по строковым ключам.
Сначала определите структуру для представления одной пары ключ-значение и другую для представления самого ассоциативного массива:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TABLE_SIZE 128
typedef struct {
char* key;
int value;
} KeyValuePair;
typedef struct {
KeyValuePair* items[TABLE_SIZE];
} AssocArray;
unsigned int hash(char* key) {
unsigned long int value = 0;
unsigned int i = 0;
unsigned int key_len = strlen(key);
for (; i < key_len; ++i) {
value = value * 37 + key[i];
}
value = value % TABLE_SIZE;
return value;
}
void initArray(AssocArray* array) {
for (int i = 0; i < TABLE_SIZE; ++i) {
array->items[i] = NULL;
}
}
void insert(AssocArray* array, char* key, int value) {
unsigned int slot = hash(key);
KeyValuePair* item = (KeyValuePair*)malloc(sizeof(KeyValuePair));
item->key = strdup(key);
item->value = value;
array->items[slot] = item;
}
int find(AssocArray* array, char* key) {
unsigned int slot = hash(key);
if (array->items[slot]) {
return array->items[slot]->value;
}
return -1;
}
int main() {
AssocArray a;
initArray(&a);
insert(&a, "key1", 1);
insert(&a, "key2", 2);
printf("%d\n", find(&a, "key1")); // Выведет: 1
printf("%d\n", find(&a, "key2")); // Выведет: 2
return 0;
}
Этот пример демонстрирует основные операции: инициализация ассоциативного массива, вставка пар ключ-значение и поиск значений по ключам. Обратите внимание, что этот код не обрабатывает коллизии и предназначен для образовательных целей.
Глубокое погружение
Концепция ассоциативных массивов предшествует языку C, но низкоуровневая природа языка не поддерживает их напрямую как встроенные типы. Это способствует более глубокому пониманию структур данных и алгоритмов, включая механизмы хеширования для эффективного сопоставления ключ-значение. Многие библиотеки и фреймворки C предлагают более сложные подходы к реализации ассоциативных массивов, такие как GHashTable
от GLib, которая предоставляет устойчивую реализацию с обработкой коллизий, динамическим изменением размера и поддержкой произвольных типов ключей и значений.
Хотя ручное создание ассоциативных массивов в C может казаться более обременительным по сравнению с языками, имеющими встроенную поддержку, это предоставляет ценные взгляды на внутреннее устройство структур данных, улучшая навыки программиста в решении проблем и оптимизации. Однако для продуктового кода или более сложных приложений использование существующих библиотек, таких как GLib, часто является более практичным и экономящим время подходом.