将字符串实现为整数查找表的快速且可维护的方式

问题描述 投票:0回答:2

我可以找到关于如何将整数映射到字符串常量的问题,并且有明显的解决方案

char const* strings[] = {"Foo", "Bar", ...};

现在,假设我要求反:我有字符串“ Bar”,并想要1。我的字符串最多4个字符,而ascii null是无效值。有64个整数可将值映射到。我是否必须编写一个长的if-else结构并进行字符串比较,还是有更好的方法?

为了澄清,我更喜欢该解决方案不需要运行时初始化,从C ++ 17开始,这使得ti无法使用std::mapstd::unordered_map

c++ string lookup-tables
2个回答
0
投票

您应该使用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();
}

0
投票

[如果您可以使用c ++ 17,则将unordered_mapstring_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

© www.soinside.com 2019 - 2024. All rights reserved.