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). Когда вы используете свой массив карт, вам понадобится какая-то форма разрешения конфликтов.