【问题标题】:Simple lookup on key for structs简单查找结构的键
【发布时间】:2014-02-03 08:59:33
【问题描述】:

有没有办法在这段代码中实现“LookupFunc”:

enum FoodType { FRUIT, VEGGIE, DESSERT };

struct Food {
    char name[20];
    int index;
    FoodType type;
};

struct Food APPLE = {"apple", 0, FRUIT};
struct Food CARROT = {"carrot", 1, VEGGIE};
struct Food CANDY = {"candy", 2, DESSERT};


struct Food f = LookupFunc("apple");
printf("indexof apple: %d\n", f.index);
printf("type of apple: %d\n", f.type);

我将只有 8 种类型的 Food 对象/结构,但搜索的可能性是无限的。理想情况下,我的结构中不需要 char name[20],它会使用变量名,但我认为 C 不能做到这一点。我有一种感觉,通过使用多维数组和使用 for 循环进行搜索,这可能会更容易。

【问题讨论】:

  • 不应该是struct Food APPLE...而不是struct Opcode APPLE...吗?
  • 是的,抱歉我现在修好了
  • 您的直觉是正确的 - C 在运行时不会保留任何变量或字段名称,因此您需要注意将值存储在数据结构中,以便之后进行搜索。我要补充的唯一建议是,您可能需要考虑对变量名称/类别使用枚举而不是字符串。

标签: c hashmap hashtable associative-array


【解决方案1】:

与 Fiddleing Bits 的答案相同,但编码较少

//define constant lookup table
const struct Food foodTable[] = {
    APPLE, CARROT, CANDY,
};
const int foodTable_len = sizeof(foodTable)/sizeof(Food);

Food LookupFunc(const char *foodStr) {
    for (int i=0; i<foodTable_len; i++) {
        bool strMatch = 0 == strcmp(foodTable[i].name, foodStr);
        if (strMatch)
            return foodTable[i];
    }

    //no match. Return something invalid
    return ?;
}

另外,为了实现一个高效的、大型的只读映射,可以制作一个哈希表并使用一个完美的(无冲突)哈希函数。请参阅wikipedia page 上的外部链接部分

【讨论】:

    【解决方案2】:

    像这样创建一个struct Food 数组:

    #define MAX_FOODS (8)
    struct Food foods[MAX_FOODS] = {
                                       {"apple", 0, FRUIT},
                                       {"carrot", 1, VEGGIE},
                                       {"candy", 2, DESSERT},
                                       ...
                                   };
    

    这样,搜索和索引将很容易。

    int i = LookupFunc("apple");
    
    int LookupFunc(char *str)
    {
        for(int i = 0; i < MAX_FOODS; i++)
        {
            if(strcmp(foods[i].name, str) == 0)
                return i;
        }
    
        return -1; // Not found
    }
    

    【讨论】:

    • 这里只有 8 个条目,数组遍历是最好的选择吗,不值得寻找更快的二叉树/哈希表方法吗?
    • @BHare 是的,如果数组足够大,应该使用不同的搜索方法。
    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多