我可以找到关于如何将整数映射到字符串常量的问题,并且有明显的解决方案
char const* strings[] = {"Foo", "Bar", ...};
现在,假设我要求反:我有字符串“ Bar”,并想要1。我的字符串最多4个字符,而ascii null是无效值。有64个整数可将值映射到。我是否必须编写一个长的if-else结构并进行字符串比较,还是有更好的方法?
为了澄清,我更喜欢该解决方案不需要运行时初始化,从C ++ 17开始,这使得ti无法使用std::map
或std::unordered_map
。
您应该使用std::map
,除非您需要更好的/自定义的东西。
std::map<std::string, int> stringToPos;
stringToPos["Foo"] = stringToPos.size(); // there's other ways to init the map, but you can fill it up this way too
stringToPos["Bar"] = stringToPos.size();
stringToPos["Bleh"] = stringToPos.size();
std::cout << stringToPos["Bleh"] << std::endl;
用于填充地图的另一种选择是:
for(auto s:{"foo","bar","bleh"})
{
stringToPos[s] = stringToPos.size();
}
[如果您可以使用c ++ 17,则将unordered_map
与string_view
一起使用。有点像
#include <iostream>
#include <string_view>
#include <unordered_map>
int main(){
std::array<char const*,2> strings = { "Foo", "Bar" };
std::unordered_map<std::string_view,int> map;
for( int i = 0 ; i != strings.size(); ++i )
map[strings[i]] = i;
std::cout << map["Foo"];
}
请参见工作版本here: