枚举与数组
Enumeration versus array
我想知道什么会更好:枚举声明或字符串数组:
enum MonthName{January, February, March, April, May, June, ...)
或
string MonthName[12] = {"January", "February", "March", "April", "May", "June", ...)
因为对我来说,这似乎并不重要。
此变量只能由一个函数访问,以根据数字输入显示月份。
显示月份的名称,enum
对你没有任何好处。 枚举类型定义中的标识符仅对编译器可见;不能在运行时打印它们。
你需要字符串数组(或者可能是 const char*
的数组)。
月份的名称也可以通过标准库获得,使用<ctime>
中声明的strftime()
函数(来自 C 标准库的 <time.h>
标头)。使用 strftime()
获取给定月份编号的月份名称并不简单(您必须先构建一个 struct tm
对象)。它确实具有使用当前区域设置的月份名称而不是硬连线为英语的优点。
并且不要忘记数组索引从 0 开始;12 月的指数为 11,而不是 12。
这很重要。如果需要可打印的文本,请使用字符串数组。枚举不会转换为可读的名称;它们只是整体价值。
枚举和数组之间没有任何共同点。使用枚举,您无法打印月份的名称,这只是一个整数...
在您的情况下,您应该使用
static const char* MonthName[2] = {"January", "February", ...};
我建议使用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
中以加快转换速度。 - 在 1 月之前在转化表中添加一个空的、未使用的条目,并且然后使用月份编号索引到表中。 上述方法比索引到数组中更健壮,因为数组具有指数和价值之间的隐含关系。 上面的例子提供 ID 和名称之间的显式关系。
在这种情况下,枚举和字符串是不同的,并且会产生不同的结果。在枚举的情况下,您可以将带有月份名称的月份数字存储在枚举类型的变量中,例如
MonthName mn = March;
变量 mn
将携带整数值2
。如果是带有月份名称的字符串数组,您需要将月份编号指定为数组索引,您将获得的是月份的字符串名称而不是月份编号,例如
string mn = MonthName[2];
变量 mn
将携带字符串"March"
,可用于显示月份。但是,您可以以更好的方式同时使用枚举和字符串数组,例如
string mn = MonthName[March];
在这里,枚举March
将充当字符串数组MonthName
的索引并返回"March"
。
- 带有枚举方向/类型的气泡排序结构数组
- C++ 指向枚举数组的指针
- 生成整数长度的枚举数组
- C++如何将字符串数组中的一个点设置为枚举变量
- 如何从枚举类值中指定模板函数参数中的数组大小?
- 初始化枚举类 (C++11) 类型的二维 std::数组
- 如何递归枚举每个元素都有上限的所有可能的数组
- 从数组中删除枚举并计算总和
- 如何有效地用枚举填充 2D std::数组
- 数组枚举和输入
- 随机生成一个没有重复元素的枚举数组 (C++)
- 地址数组,带有枚举的返回值
- 错误:数组大小表达式必须具有整型或无作用域枚举类型,而不是'double'
- C++ 中的枚举中的数组
- 枚举与数组
- 枚举数组相对于常量和宏的优势
- 传递枚举数组是什么意思
- 枚举数组错误之前的预期主表达式
- 如何使用枚举初始化向量/数组
- 使用固定值枚举数的枚举零初始化