【发布时间】:2017-12-15 20:33:25
【问题描述】:
我想以这样的方式定义结构数组,以便可以轻松执行搜索操作,并且可以使用枚举值检索字符串。
例如:
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",
};
定义数组以实现上述两种操作的最佳/最佳方式是什么?
【问题讨论】:
-
" 但是,如果我想使用枚举值来查找一些字符串,比如..." - 简单明了,你做不到。这不是您的基本数组的定义方式。当然,您可以建立一个由 566 个指针组成的数组,除了少数几个都初始化为您的“默认值”,其余的都设置为您的特定字符串。以复杂(和明显)的存储设施和初始化设置为代价,您不会获得比直接查找更好的性能。也就是说,如果这在某种程度上是您代码的关键性能路径,哇。