【问题标题】:Ideal data type for an array in CC中数组的理想数据类型
【发布时间】:2012-10-31 16:40:21
【问题描述】:

我想在键和可变大小数组之间存储静态关联。

"foo" => ["bar", "awe"]  
"foo2" => ["bar2", "awe2", "gruh"]

这个数组在程序执行过程中永远不会改变,它只是一种将字符串变量数组与字符串键静态关联的一种方式。

子数组的数量非常少(

我怎样才能在纯 C 中做到这一点?

【问题讨论】:

  • 取决于您如何解决所需的性能。
  • 您可以查看一些用于创建“最小完美哈希函数”的辅助程序。在你的钥匙上运行它。然后只需存储负载数据的静态数组,以及哈希函数。

标签: c arrays static


【解决方案1】:

好的,这是有人给我的解决方案:

struct
{
  const char *key;
  const char **values;
} key_to_values[] =
{
  { .key = "foo", .values = (const char *[]) { "val1", "val2", NULL } },
  { .key = "bar", .values = (const char *[]) { "val3", "val4", "val5", NULL } },
};

【讨论】:

  • 恕我直言,这是一种不好的做法,即非常不可读的代码。基本上,您只是创建一个具有两个指针作为成员的结构,并使用静态数组初始化这些指针。我同意它可以实现您的意图,但同样它没有使用任何内置的 c 构造。编写一个已经在另一个解决方案中编写的哈希表对我来说似乎要好得多。
  • @fayyazkl:我不明白你说的话有什么意义。首先,上述代码实际上完全基于 C 语言的内置结构。其次,C语言没有内置“哈希表”之类的东西,因此您对“内置”的引用完全不清楚。最后,对于一个常量数据结构,这实际上是最好的解决方案。
  • @AndreyT 我相信您还没有完整阅读之前答案的内容。上面的代码基于纯 c 结构,但没有内置支持将数组索引映射到字符串。它必须像之前建议的那样手动编码。上面的示例是手动手动编码的整个映射。我从来没有尝试争论哈希表是一个原始结构。但是由于您必须编写任何您选择的代码,我建议编写哈希是一种更好的方法,并且可以生成更具可读性的代码。
  • 对于 OP 提到的子数组数量接近至少 100 个的常量数据结构,我会说这会产生非常难看的代码。对于任何新开发人员来说,哈希看起来更加优雅、可读且更易于维护。
【解决方案2】:

如果我正确理解您的意图,您希望将数组与字符串键相关联,那么我认为使用核心 c 中的任何内置构造都不可能做到这一点,即 c 数组仅由整数索引。

哈希表总是可以写的,但是字符串到索引的映射需要程序员自己来完成。

在 C++ 中,您可以使用映射来实现此目的,但映射是 STL 的一部分。

【讨论】:

    【解决方案3】:

    您可以使用哈希表来做到这一点。

    例如:

    #include <stdint.h>
    #include <string.h>
    
    uintmax_t hash(const char *s) { /* ... */ }
    
    static const char t[N][M];
    
    void init_string(void)
    {
        strcpy(t[hash("foo")][0], "bar");
        strcpy(t[hash("foo")][1], "awe");
        /* etc */
    }
    
    char *get_string(const char *s)
    {
        return t[hash(s)];   
    }
    

    待办事项:

    • 设置NM
    • 定义hash函数;
    • 处理冲突;
    • 处理其他错误。

    【讨论】:

    • 我的需求非常基本,但您的解决方案非常适合具有读/写约束的动态解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    相关资源
    最近更新 更多