繁体   English   中英

如何使用 C++ 中的 map 将枚举值分配给字符串

[英]how to assign the enum values to strings using map in C++

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

下面是我为此编写的代码片段:

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

这样它就可以工作了。 但是每次它都会循环遍历 map 中的所有项目。 有没有更好的方法将 map 枚举到字符串?

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

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

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

有一些微妙之处,所以这里有一个简单的例子(可在此处运行):

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

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

您可以使用查找表:

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 ,它将在运行时之前初始化或直接访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM