在C中映射类似结构:使用int和struct来确定值

时间:2014-02-22 18:06:10

标签: c dictionary indexing struct

我曾经用C ++编写代码,现在我尝试用C语言编写。

假设我已经定义了一个struct

struct point{
    int x;
    int y;
}

A中是否有可支持以下功能的数据结构c: 给定两个整数,比如ij,以及两个点,比如p1p2A[i][j][p1][p2]可以唯一确定一个值。

听起来像一个4维阵列。但是,索引不再是int,而是用户定义的struct

1 个答案:

答案 0 :(得分:21)

你可能需要制作自己的结构。 Kernighan和Ritchie的C编程语言有一个用c制作关联地图的例子,下面我详细介绍的是基于我记得的内容。

基本上,您需要一个包含struct Key 和struct Value 的结构 Map

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

struct 包含确定值的元素(在您的情况下为2点和2个整数)

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

struct 是您希望密钥指向的任何内容(您没有说过)

您现在有一个结构地图,它将您的四个输入与一个值相关联,但单个地图并不是很有用。你会想要一大堆它们。

struct Map map[SIZE_OF_MAP];

如果您不想线性搜索数组以寻找您正在寻找的地图结构,您可以创建一个哈希函数,直接将它带到它。只需定义一个接受键的函数,并使用其值为数组中的索引赋值。使用哈希将 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 提供相同结果时会发生什么)。当您使用地图数组时,您需要某种形式的碰撞解决方案。