【问题标题】:typedef enum inputtypedef 枚举输入
【发布时间】:2012-04-13 12:55:02
【问题描述】:

如果我们在 c++ 中有这个:

typedef enum {Unknown,USA,Canada,France,England,Italy,Spain,Australia,} origin_t;

origin_t Country;
char *current;
cin>>current;

我们如何将Country 设置为用户输入的c-String current? 因为我们有一个很大的列表,所以除了一个一个比较? 最快的方法? 非常感谢。

【问题讨论】:

  • 旁注,因为current 是未初始化的指针,所以会出现段错误。
  • 旁注,这是未定义的行为,可能会出现段错误。

标签: c++ enums typedef


【解决方案1】:

在 C++ 中 enumstringchar* 之间没有直接转换,就像在 Java 中一样。

一个有效的方法是有一张地图:

#include <map>
#include <string>

typedef enum {Unknown,USA,Canada,France,England,Italy,Spain,Australia,} origin_t;

std::map<std::string, origin_t> countries;
countries["Unknown"] = Unknown;
countries["USA"] = USA;
//...

origin_t Country;
std::string current;
cin>>current;
Country = countries[current];

请注意,在我的示例中,我使用的是std::string 而不是char*,除非您有充分的理由使用char*,否则您应该这样做。

【讨论】:

  • 国家[“未知”] = 未知;在第二个给我未声明的标识符!好的,我将使用字符串...
  • OOPSSS 对不起,我在定义枚举时写了 Unkown 非常感谢 Luchian!!!!我刚开始编程。谢谢
  • 顺便说一句,这是最好,更有效的方式??如果我们有一个并行数组,我们想要填充用户为每个数组输入国家/地区的位置,我们只需将其放入 for 循环中......没有更有效的方法吗?
  • @DaggerJay11 对地图中元素的访问是 O(1)。使用不同方法可能获得的任何收益似乎都微不足道。
  • @LuchianGrigore 对地图中元素的访问是 O(lg n),而不是 O(1)。然而,过去经常这样做(甚至编写自动生成它的代码),使用map 的解决方案具有很高的恒定开销。大多数枚举只有几个元素,简单的线性搜索会更快。 (如果你是自动生成的,你可以对值进行排序并使用二进制搜索,但根据我的经验,它并不能真正为你买任何东西。除非你的代码中填充了数百个值的枚举。)
【解决方案2】:

我使用的是一组 POD 结构。该结构包含与特定枚举对应的字符的枚举和 const char *。然后我使用 std::find 来查找 enum 或 char * 取决于需要哪个。

POD 数组的优点是一切都在程序加载时初始化。无需加载地图。

缺点是 std::find 的线性搜索。但这从来都不是问题,因为我从来没有大量的枚举值。

以上都隐藏在实现文件中。标题只有功能。通常一个从枚举转换为 std::string,另一个从 std::string 转换为枚举。

【讨论】:

  • 我认为一次在地图中插入所有值的开销远低于多次调用 std::find。
  • @Luchian - 当然,这取决于有多少枚举值。此外,可以手动对数组进行排序并使用更有效的搜索算法。但正如我所说,我的项目中枚举值的数量很少。
  • 我想这是一个选项,但你不得不承认,使用地图更方便。不那么冗长。
  • @Luchian 我不明白如何使用地图不那么冗长。您的代码 sn-p 肯定不是很多代码,但那是因为您省略了错误检查(这对于代码 sn-p 是可以理解的)。
  • @AnonMail 这是我最终采用的解决方案。在用真实代码尝试并测量了其他人之后。实际上,如果枚举中没有初始化器,我只需生成一个char const* 的表,然后从开头减去最终索引即可获得枚举值。
猜你喜欢
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多