c - 初始化二维数组是否可以将连续整数映射到 C 中的字符串?
问题描述
我必须将连续的整数代码从 1 映射到 100 到 C 中的字符串。通常,对于数字到字符串的映射,我会有这样的事情:
#define code1 1
#define code2 2
.
.
#define code100 100
struct map
{
int code;
char *msg;
}objs[100];
然后我将遍历 obj,如果数字匹配,我将使用 obj 数组的相应字符串。因为我知道要映射的数字是连续的,所以我可以这样做:
const char *arr[100] = { "abc", "def", ....... "100th msg"};
然后我可以忘记循环并打印 arr[code]。这是一个不好的方法吗?我看到的唯一缺点是,当其他人在中间添加代码时,他们必须小心。优点显然是我不需要遍历 struct 数组。
解决方案
使用直接索引数组是一种常用的方法,如果数据从不(很少)更改并且没有太多间隙,则可以正常工作,因为您为每个间隙花费了一条记录。在某些时候,差距的管理或存储成本可能会成为一个问题。
如果您需要处理数据的更多动态编译时更新,那么下一个最好的方法是排序数组。如果您可以保证您的条目始终按顺序排列,但可能存在间隙,或者在末尾添加了新条目,那么您可以二进制切分您的有序数组以快速找到您想要的条目。您可能希望执行一次启动过程来检查数组是否正确排序,但您只需执行一次。
如果您需要担心运行时更新,那么您需要考虑更高级别的容器抽象,例如映射树或哈希图。
推荐阅读
- node.js - node.js readline:“TypeError:rl 不可迭代”
- angular - CodeSandbox 上的“没有 ErrorHandler 错误。是否包含平台模块(BrowserModule)”
- xcode13 - Xcode 13 - 在工具栏中隐藏 git 分支
- mysql - Mysql查询结果为每个类别生成月份(1-12)并按类别排列在同一列中
- asp.net-core - .net-core 没有立即释放大对象(在 linux 下)的原因可能是什么?
- python - 使用 Python 字典计算 txt 文件中的项目
- python - vscode 查找 jupyter 扩展的完整版本构建号
- javascript - 在 contenteditable true 元素中选择 contenteditable false 元素
- vue.js - vue 3 - 选择绑定问题,如果选择的选项未显示在新值中,则选择为空白,但不会更改为“”
- html - 如何解决下拉菜单错误且不显示?