【发布时间】:2021-04-13 04:01:34
【问题描述】:
对于我目前正在处理的作业,我为不同的学期定义了一个枚举类。
enum class Semester {
FALL,
SPRING,
SUMMER
};
在我重载的<< 运算符中,我将打印出与Semester 类型等效的小写字符串。我已经通过使用Semester 键和std::string 对创建映射来做到这一点:
std::map<Semester, std::string> to_string
{
{Semester::FALL, "fall"},
{Semester::SPRING, "spring"},
{Semester::SUMMER, "summer"}
};
std::stream& operator <<(std::stream& ost, enum Semester semester)
{
return ost << ::to_string[semester];
}
我已经不确定之前的解决方案是否是最优的,所以我开始着手下一个任务,即定义Semester load_semester(std::istream& ist)。此函数接收来自用户的输入为std::string(我想我会使用std::getline())并将其转换为Semester 类型。我想我可以使用类似于之前的地图,但我很好奇解决这个问题的“正确”方法是什么。
编辑:感谢您的反馈!我将按照@casey 的建议实现功能。
我正在为学期和部分(即数学、阅读、科学等)实施枚举课程。将来我可能需要实施更多。我能否以可以重用它们的方式实现这些功能?
【问题讨论】:
-
我认为您在学习时不应该担心“最佳”代码。通常情况下,您会被无关的性能问题所困扰,以至于在实际功能上没有任何进展,或者最终陷入难以调试的奇怪问题。地图很好,但更常见的方法是只使用数组。通过您当前使用此映射的方式,您不会在这里获得太多收益,除非您的枚举是范围之外的值,您的映射将隐式 add 新的空字符串,而未经检查的数组访问会导致未定义的行为。
-
我很好奇解决这个问题的“正确”方法是什么。就像编程中的许多事情一样,这是一个见仁见智的问题。
标签: c++ string dictionary input enums