如何正确使用std::cout输出std::unordered_map元素避免报错
问题原因
- 类型不匹配:你定义的
points是std::unordered_map<std::string, int>类型,key的类型为std::string,但word[1]是char类型,二者类型不符,所以编译器抛出错误。 - 隐藏逻辑问题:你读取分值文件、输出map值的代码都放在了
cin输入循环结束之后,只有当你终止输入(例如按Ctrl+D/Ctrl+Z)时才会执行后续逻辑,此时word存储的是最后一次输入的单词,若单词长度不足2,访问word[1]会触发越界,导致程序崩溃。
修复方案
方案1(更推荐):修改map的key类型为char
因为你的分值配置本来就是单个字母对应分值,用char做key更符合业务逻辑,修改两处代码即可:
- 将map定义修改为:
std::unordered_map<char, int> points;
- 将存储字母的变量修改为
char类型:
char letter;
修改后直接用word[1]访问map就不会出现类型错误。
方案2:不修改map类型,将char转为string后访问
如果不想调整map的定义,可以在访问时把单个字符转为长度为1的string:
std::cout << points[std::string(1, word[1])] << '\n';
额外逻辑优化建议
如果你需要为每一个输入的单词计算分值,应该调整代码逻辑的位置:
- 分值文件只需要读取一次,放在
main函数最开头执行即可,不需要放在输入循环之后 - 单词分值计算逻辑放到
cin输入循环内部,每读到一个合法单词就计算对应分值
内容的提问来源于stack exchange,提问作者goby gonagle
相关产品推荐
相关产品推荐

