【问题标题】:Enumeration versus array枚举与数组
【发布时间】:2012-12-13 19:07:17
【问题描述】:

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

enum MonthName{January, February, March, April, May, June, ...)

string MonthName[12] = {"January", "February", "March", "April", "May", "June", ...)

因为对我来说这似乎并不重要。

这个变量只能被一个函数访问,根据输入的数字显示月份。

【问题讨论】:

  • 如果显示它,字符串数组会更好。您不能将枚举项的名称自动转换为字符串。
  • 汽车和披萨哪个更好?它们做了两件完全不同的事情。
  • @PeteBecker 这很简单...披萨。
  • @LuchianGrigore - 不,你可以卖掉汽车并得到很多披萨。
  • 啊,不错。我想我的困惑在于我没有意识到你不能打印枚举值。所以,就是这样。感谢您的帮助。

标签: c++ arrays enums


【解决方案1】:

如果您想显示当月的名称enum 对您毫无用处。枚举类型定义中的标识符仅对编译器可见;你不能在运行时打印它们。

您需要字符串数组(或者可能是const char*s 数组)。

月份的名称也可以通过标准库获得,使用在<ctime> 中声明的strftime() 函数(来自C 标准库的<time.h> 标头)。使用strftime() 获取给定月份编号的月份名称并不简单(您必须先构建一个struct tm 对象)。它确实具有使用当前语言环境的月份名称而不是硬连线到英语的优势。

别忘了数组索引从 0 开始; 12 月的指数为 11,而不是 12。

【讨论】:

    【解决方案2】:

    这很重要。如果您需要可打印的文本,请使用字符串数组。枚举不会转化为可读的名称;它们只是整数值。

    【讨论】:

      【解决方案3】:

      枚举和数组之间没有任何共同之处。 使用枚举不能打印月份的名称,这只是一个整数...

      在你的情况下,你应该使用

      static const char* MonthName[2] = {"January", "February", ...};
      

      【讨论】:

      • @BenVoigt:这在 C++ 中有效吗?在我看来更像 C#。
      • @Keith:哎呀,我回答了关于这两个问题的问题,搞混了。我认为这是使用string(而不是std::string)。
      【解决方案4】:

      我建议将两者结合起来,使用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. 在一月之前在转换表中添加一个空的未使用条目, 然后使用月份编号索引到表中。上述方法 比索引到数组更健壮,因为数组有一个 指数和价值之间的隐含关系。上面的例子 提供 ID 和名称之间的明确关系。

      【讨论】:

        【解决方案5】:

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

        MonthName mn = March;
        

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

        string mn = MonthName[2];
        

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

        string mn = MonthName[March];
        

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

        【讨论】:

        • 不要命名变量__mn。包含两个连续下划线的名称保留给实现。以下划线后跟大写字母的名称也是如此。
        • 感谢您的评论。我知道但无意中在这里使用了它。将保留它以备将来使用...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 2013-01-17
        • 2011-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        相关资源
        最近更新 更多