【问题标题】:how to assign the enum values to strings using map in C++如何使用 C++ 中的映射将枚举值分配给字符串
【发布时间】:2021-07-24 16:19:03
【问题描述】:

我有一个包含字符串和枚举的地图。我得到一个枚举值作为输入,我需要从中获取一个字符串。

下面是我为此编写的代码 sn-p:

std::map<std::string, Messages> m_MessagesMap;

auto MessageID = GetMessageID();
GetStringFromEnum(MessageID);
std::string CJsonMessageUtil::GetStringFromEnum(Messages l_eMessages)
{
    for (auto it = m_MessagesMap.begin(); it != m_MessagesMap.end(); ++it)
    {
        if (it->second == l_eMessages)
            return it->first;
    }

    return "";
}

这样就可以了。但每次它都会遍历地图中的所有项目。有没有更好的方法将枚举映射到字符串?

【问题讨论】:

  • 您可以使用 2 个地图:std::map<:string messages> m_StrToMessages; std::map m_MessagesToStr;
  • 摆脱地图;使用 switch 语句,只返回每个 case 的字符串值。
  • 嘿@Yar,对提供的 2 个答案有任何反馈吗?

标签: c++ c++11 visual-c++


【解决方案1】:

如果您不需要该地图来做其他事情,那么最简单的就是这个,正如@Casey 所建议的那样:

std::string
getString( EnumType et )
{
  switch( et )
  {
   case et1: return "string1";
   case et2: return "string2";
   ...
   default: assert(0);
  }
}

但如果您确实需要在其他地方使用该地图(当然不要复制其内容),您可以使用 bimap。 Boost 提供了一个,请参阅boost::bimap。它只有标头,因此很容易集成到您的代码中。

有一些微妙之处,所以这里有一个简单的例子 (runnable here):

#include <boost/bimap.hpp>
enum MyEnum
{
    hello, world
};

using MyMap = boost::bimap<std::string,MyEnum>;

int main()
{   
    MyMap m;
    m.insert( MyMap::value_type("hello", hello ) );
    m.insert( MyMap::value_type("world", world ) );

    std::cout << m.right.at( hello );
}

如果您在该地图中有许多值,那可能是值得的。而且我确信可以以更有效的方式初始化值,但我目前无法搜索。

【讨论】:

  • 糟糕,在第一个解决方案中错过了开关!已更正。
  • 另外,break; 语句是多余的; returns 将导致它们被跳过。
  • @Casey 啊,是的,当然。
【解决方案2】:

您可以使用查找表:

enum Trees {REDWOOD, MAPLE, OAK, SYCAMORE, EUCALYPTUS};
struct Enum_Conversion_Table
{
    enum Trees value;
    const char * text;
};

static const Enum_Conversion_Table table[] =
{
    {REDWOOD, "Redwood"},
    //...
    {EUCALYPTUS, "Eucalyptus"},
};
static const unsigned int table_size =
    sizeof(table) / sizeof(table[0]);

表格数据类型可以让你通过枚举搜索找到文本,或者通过文本搜索得到枚举值。

您也可以在不更改搜索代码的情况下更改表格的大小。

由于该表被标记为static const,它将在运行时初始化或直接访问。

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多