我想以这样的方式定义结构数组,以便可以轻松地执行搜索操作,并且可以使用枚举值检索字符串。
例如:
enum MY_ENUM {
MY_ENUM_VAL = 0,
MY_ENUM_VAL_8 = 8,
MY_ENUM_VAL_50 = 50,
MY_ENUM_VAL_200 = 200,
MY_ENUM_VAL_565 = 565,
};
struct my_struct {
int val;
char *str;
};
/* Struct array */
struct my_struct my_struct_array[] = {
{ MY_ENUM_VAL, "str0" },
{ MY_ENUM_VAL_8, "str8" },
{ MY_ENUM_VAL_50, "str50" },
{ MY_ENUM_VAL200, "str200" },
{ MY_ENUM_VAL_565, "str565" },
};
像这样定义数组的好处是我可以进行搜索操作,如果我在数组中找不到任何值,那么我可以指定一些默认值。但是,如果我想找到一些使用枚举值的字符串,该怎么办?
char *str50 = my_struct_array[MY_ENUM_VAL50].str; // this won't work.
如果我根据下面的枚举值进行索引,那么我就无法进行搜索操作。另外,如果我有一些像300这样的随机值,我可能会得到一些垃圾值。
/* String array */
const char *my_string_array[] = {
[MY_ENUM_VAL] = "str0",
[MY_ENUM_VAL_8] = "str8",
[MY_ENUM_VAL_50] = "str50",
[MY_ENUM_VAL200] = "str200",
[MY_ENUM_VAL_565] = "str565",
};
定义数组的最佳/最佳方法是什么,以便可以实现上述两种操作?
快速搜索不是一项简单的操作。 C语言没有提供简单的方法来处理(键,值)映射,如C ++中的std::map
或std::unordered_map
或Python中的dict
。您只能使用标准库中的函数。 C99定义了bsearch
,它允许在排序数组中进行二分法搜索,Posix定义lsearch
(线性搜索)和hsearch
(使用密钥哈希直接访问)。或者在普通和单个C中,扫描数组以获取密钥。