Використання асоціативних масивів

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, часто є більш практичним і ефективним за часом підходом.