CS50 PSET3 Runoff中vote函数preferences[voter][rank] = i;作用疑问
变量i的含义
这里的i是当前匹配到的候选人在candidates数组中的下标索引。遍历candidates数组时,i从0开始自增,依次对应数组中每一个候选人的位置,当strcmp(candidates[i].name,name)==0成立时,i就代表当前用户投票的目标候选人在全局候选人数组里的唯一数字标识。
为什么不直接存储candidates[i]
有两个核心原因:
- 类型不匹配:Runoff作业的预设代码中,
preferences是定义为int preferences[MAX_VOTERS][MAX_CANDIDATES]的二维整数数组,只能存储整数类型的值,无法直接存储candidate结构体类型的candidates[i],如果强制赋值会直接触发编译错误。 - 存储效率更高:用索引指代候选人是更合理的设计:一方面不需要在
preferences里重复拷贝候选人的姓名、得票数、是否被淘汰等全量结构体数据,节省内存空间;另一方面后续统计票数、淘汰候选人时,只需要拿着这个索引去candidates数组里读取/修改对应候选人的属性即可,不需要同步维护preferences里的冗余数据,逻辑更简洁也不容易出bug。
额外提示:你贴的代码片段缺少遍历完全部候选人后未匹配到姓名时的return false分支,实际编译运行前需要补全,否则会触发未定义行为。
内容的提问来源于stack exchange,提问作者n350xwb
相关产品推荐
相关产品推荐

