枚举与数组

Enumeration versus array

本文关键字:数组 枚举      更新时间:2023-10-16

我想知道什么会更好:枚举声明或字符串数组:

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);
}

两个优化:

  1. 将表加载到std::map中以加快转换速度。
  2. 在 1 月之前在转化表中添加一个空的、未使用的条目,并且然后使用月份编号索引到表中。 上述方法比索引到数组中更健壮,因为数组具有指数和价值之间的隐含关系。 上面的例子提供 ID 和名称之间的显式关系。

在这种情况下,枚举和字符串是不同的,并且会产生不同的结果。在枚举的情况下,您可以将带有月份名称的月份数字存储在枚举类型的变量中,例如

MonthName mn = March;

变量 mn 将携带整数值2 。如果是带有月份名称的字符串数组,您需要将月份编号指定为数组索引,您将获得的是月份的字符串名称而不是月份编号,例如

string mn = MonthName[2];

变量 mn 将携带字符串"March",可用于显示月份。但是,您可以以更好的方式同时使用枚举和字符串数组,例如

string mn = MonthName[March];

在这里,枚举March将充当字符串数组MonthName的索引并返回"March"