【问题标题】:key value in C with different data typeC中具有不同数据类型的键值
【发布时间】:2019-11-29 04:19:49
【问题描述】:

我正在研究 c,我正在尝试在 C 中实现一个字典(键,值)对,但我拥有的键列表来自不同类型,例如(int x.double y,char z)结构中的键和值的类型是什么?

更新:主要目的是将所有变量的值存储在特定程序中(我需要一个 var:val 的字典)

这在 C 中可能吗?

struct key_value
{
    char key;  // what is the type of key?
    int value; // what is the type of value?
};

【问题讨论】:

  • 需要保留类型吗?如果不使用sprintf() 将所有内容转换为它们的文本表示并将它们存储为C 字符串?其他事情变得复杂。
  • 为什么键的类型如此不同?或者它是真正具有变化类型的值,并且键指示类型?这个结构要解决的总体问题是什么?
  • 是否要保持所有数据类型不变?
  • @ArisKantas 是的,因为我需要打印所有这些值,并且为了打印它们我需要知道它们的类型。

标签: c dictionary struct hashmap


【解决方案1】:

这样做的主要目的是将所有变量的值存储在特定程序中

由于只有库的用户才知道密钥是什么以及如何存储以及如何比较密钥,因此用户应该传递它自己的函数和回调来使用密钥。

struct map_s {
    /* some data for the map */
    int (*key_cmp)(void *key1, void *key2); 
};

struct key_value {
    void *key;
    int value; // what is the type of value?
};

或者您可以将函数指针放在struct key_value 中,具体取决于您希望实现的样子。然后你的库可以调用用户提供的比较函数来知道键是否是这个键。

int map_find_value(struct map_s *map, void *key) {
    for (struct key_value *iterator /* iterate over key_values here */ ) {
       if (map->key_cmp(key, iterator->key)) {
             return iterator->value;
        }
     }
}

如果您的库不知道密钥是什么,您不应该对它做任何假设 - 让您的库的用户处理它。

根据您的库实现,您可能还希望传递一个函数指针,该指针将像 ex 一样破坏/释放密钥。 void (*key_destruct)(void *key) 和前。这将复制密钥,例如int (*key_copy)(void **to, void *from),以便您可以对密钥进行操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多