[英]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.