Map like structure в C: используйте int и struct для определения значения

раньше я кодировал на C++ , а теперь пытаюсь программировать на C.

предположим, я определил структуру

struct point{
    int x;
    int y;
}

есть ли какая-либо структура данных A на c это может поддержать следующую функциональность: Даны два целых числа, скажем i и j, и два пункта, скажем p1 и p2. A[i][j][p1][p2] можно однозначно определить значение.

это звучит как 4-d массив. Однако индексы больше не являются int, а определяются пользователем struct.

1 ответов


вам, вероятно, придется сделать свою собственную структуру. язык программирования C от Kernighan и Ritchie имеет пример создания ассоциированной карты в c, и то, что я подробно расскажу ниже, основано на том, что я помню из этого.

в основном вам понадобится структура карта который содержит struct ключ и struct стоимостью.

struct Map {
    struct Key key;
    struct Value value;
};

struct ключ содержит элементы, определяющие значение (в вашем case 2 points and 2 ints)

struct Key {
    struct point p1;
    struct point p2;
    int i;
    int j;
};

struct стоимостью это то, что вы хотите, чтобы ваш ключ указывал (вы не сказали)

теперь у вас есть структура карта это связывает ваши четыре входа со значением, но одна карта не так полезна. Вам понадобится целый набор.

struct Map map[SIZE_OF_MAP];

если вы не хотите линейно искать массив для карта структура, которую вы ищете, вы можете сделать функцию хэширования, которая приведет вас прямо к нему. Просто определите функцию, которая берет ключ и использует его значение для присвоения ему индекса в массиве. Используйте хэш для размещения карта в массиве и получить его из массива. (Примечание: Я не уверен, что это правильный пример хеширования, пожалуйста, исправьте, если это совершенно неправильно)

int get_hash(Key *key)
{
    int result;
    /* combine all inputs in some way */
    result = key->i * key->i + (key->p1.x * key->p1.x) - (key->p2.x * key->p2.x)
    /* make sure result isn't out of bounds of the array */
    return (result % SIZE_OF_MAP);
}

если вы используете функцию хэширования, вам придется учитывать коллизии (что происходит, когда два ключа дают один и тот же результат для get_hash). Когда вы используете свой массив карт, вам понадобится какая-то форма разрешения конфликтов.