我想知道什么会更好:枚举声明或字符串数组:
enum MonthName{January, February, March, April, May, June, ...)
或者
string MonthName[12] = {"January", "February", "March", "April", "May", "June", ...)
因为对我来说这似乎并不重要。
这个变量只能被一个函数访问,根据输入的数字显示月份。
如果你想显示月份的名称enum
,那对你没有任何好处。枚举类型定义中的标识符仅对编译器可见;你不能在运行时打印它们。
您需要字符串数组(或者可能是const char*
s 数组)。
月份的名称也可以通过标准库使用(来自 C 标准库的头文件)strftime()
中声明的函数获得。使用给定月份编号获取月份名称并不简单(您必须先构建一个对象)。它确实具有使用当前语言环境的月份名称而不是硬连线到英语的优势。<ctime>
<time.h>
strftime()
struct tm
并且不要忘记数组索引从 0 开始;12 月的指数为 11,而不是 12。
这很重要。如果您需要可打印的文本,请使用字符串数组。枚举不会转化为可读的名称;它们只是整数值。
枚举和数组之间没有任何共同点。使用枚举,您无法打印月份的名称,这只是一个整数......
在您的情况下,您应该使用
static const char* MonthName[2] = {"January", "February", ...};
在这种情况下,枚举和字符串都是不同的,会产生不同的结果。如果是枚举,您可以将月份名称和月份名称存储在枚举类型的变量中,例如
MonthName mn = March;
该变量mn
将携带整数值2
。如果是带有月份名称的字符串数组,您需要将月份编号指定为数组索引,您将得到月份的字符串名称而不是月份编号,例如
string mn = MonthName[2];
该变量mn
将携带字符串"March"
并可用于显示月份。但是,您可以以更好的方式同时使用枚举和字符串数组,例如
string mn = MonthName[March];
在这里,枚举March
将作为字符串数组的索引MonthName
并返回"March"
.
我建议使用以下表格将两者结合起来structs
:
enum Months
{
JANUARY = 1,
FEBRUARY,
APRIL,
//...
DECEMBER,
NUMBER_OF_MONTHS
};
struct Month_Enum_Conversion_Entry
{
Months month_id;
char const * const month_name;
};
Month_Enum_Conversion_Entry month_conversion_table[] =
{
{JANUARY, "January"},
{FEBRUARY, "February"},
//...
{DECEMBER, "December"}
};
static const unsigned int NUM_TABLE_ENTRIES =
sizeof(month_conversion_table) / sizeof(month_conversion_table[0]);
要将枚举转换为文本,请在表中搜索枚举并访问文本字段:
std::string Month_ID_To_Name(Months m)
{
char const * p_month_name = NULL;
for (unsigned int i = 0; i < NUM_TABLE_ENTRIES; ++i)
{
if (month_conversion_table[i].month_id == m)
{
p_month_name = month_conversion_table[i].month_name;
break;
}
}
return std::string(p_month_name);
}
两个优化:
std::map
中以实现更快的转换。