C语言中的字符串/整数关联

C语言中的字符串/整数关联,c,string,hash,integer,associations,C,String,Hash,Integer,Associations,我想用c语言对以下问题提出建议: 我需要字符串和整数之间的关联,如下所示: "foo" => 45, "bar" => 1023, etc... 并且能够使用关联的整数找到字符串,并使用关联的字符串找到整数。 对于字符串到整数的转换,我可以使用哈希表,但我会放弃返回的方法 我正在使用的一个简单解决方案是创建一个表,但速度非常慢: 静态参数[]={ {“foo”,45}, {“bar”,1023}, ... }; 并使用两个函数比较每个条目(字符串或整数)以获得字符串或整数。 这是

我想用c语言对以下问题提出建议:

我需要字符串和整数之间的关联,如下所示:

"foo" => 45,
"bar" => 1023,
 etc...
并且能够使用关联的整数找到字符串,并使用关联的字符串找到整数。 对于字符串到整数的转换,我可以使用哈希表,但我会放弃返回的方法

我正在使用的一个简单解决方案是创建一个表,但速度非常慢: 静态参数[]={ {“foo”,45}, {“bar”,1023}, ... }; 并使用两个函数比较每个条目(字符串或整数)以获得字符串或整数。 这是一个非常缓慢的线性搜索。 在O(1)中使用什么搜索算法来查找字符串和O(字符串大小)来查找整数?
有什么想法吗?

首先对列表进行排序,然后使用查找项目。它不是O(1),但至少是O(log(n))。

最简单的方法是实现查找表,最好按整数值(“主键”)排序

现在,您可以使用
int\u数组[FOO\u INDEX]
str\u数组[FOO\u INDEX]
来获取所需的数据

因为这些是在编译时设置的常量表,所以可以对数据进行排序。然后可以使用二进制搜索O(logn)完成所有查找。如果您有整数值,但需要知道索引,请在int_数组上执行二进制搜索。一旦你找到了索引,你就可以从那里得到即时的查找

要使其工作,两个数组必须具有精确的大小
N
。要确保这些数组中的数组大小和数据完整性,请使用编译时断言:

static_assert(sizeof(int_array)/sizeof(*int_array) == N, "Bad int_array");
static_assert(sizeof(str_array)/sizeof(*str_array) == N, "Bad str_array");

使用两个哈希映射。一个用于从整数到字符串的关联,另一个用于从字符串到整数的关联。

一种低效的方法是将其转换为基数256。第一个字母ASCII乘以256(0(1)的幂)加上第二个字母ASCII乘以256(1的幂),依此类推。效率非常低(因为long不够,所以要么将数字包含在另一个字符串中,要么使用数学C库。我知道Ruby和Perl中有哈希,它基本上是一个数组,您可以使用某个键(可以是字符串)进入该数组)但是我不知道它是如何工作的。

哈希映射呢?答案不错,但值得注意的是,如果使用静态断言,数组必须在声明时不使用
N
(比如
const int int int_array[]={…}
)当然,我不知道我在想什么。我不确定我在想什么。我会编辑,谢谢。不是代码> STATICO-AsHypS/<代码> C++吗?好吧,但是我如何得到字符串“bar”,它有整数1023?我仍然需要一种方法来找到它的位置。@“如果您有整数值,但需要知道索引,请对int_数组执行二进制搜索。”因此,在搜索1024时,您将得到索引1(等于BAR_index)。然后只需访问
str_数组[1]
获取相应的字符串。只有当您有字符串并且需要获取整数时,才真正需要哈希映射,即当字符串是主键时。即使如此,您也可能只使用普通排序表。虽然如果允许重复,哈希映射很有用。如果我已经有了哈希映射实现(我想如果这是Perl或java),我会用这两种方式。只有我自己必须实现一个,我才会考虑使用其他的东西从整数到字符串。
static_assert(sizeof(int_array)/sizeof(*int_array) == N, "Bad int_array");
static_assert(sizeof(str_array)/sizeof(*str_array) == N, "Bad str_array");