C++ 实现字符串到整数查找表的快速且可维护的方法

C++ 实现字符串到整数查找表的快速且可维护的方法,c++,string,constexpr,lookup-tables,C++,String,Constexpr,Lookup Tables,关于如何将整数映射为字符串常量的问题,我可以找到很多答案,答案显而易见 char const* strings[] = {"Foo", "Bar", ...}; 现在,假设我想要相反的结果:我有字符串“Bar”,想要1。我的字符串最多为4个字符,ascii null不是有效值。要将值映射到64个整数。我是否必须使用字符串比较编写长的if-else构造,还是有更好的方法 为了澄清,我更喜欢不需要运行时初始化的解决方案,从C++17开始,这使得ti不可能使用std::map或std::unorde

关于如何将整数映射为字符串常量的问题,我可以找到很多答案,答案显而易见

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;

除非您需要更好的/定制的,否则您应该使用
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;

如果你能用c++17,我会用
unordered\u映射
string\u视图
s。差不多

#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"];
}
#包括
#包括
#包括
int main(){
数组字符串={“Foo”,“Bar”};
std::无序地图;
对于(int i=0;i!=strings.size();++i)
map[strings[i]]=i;

std::cout如果你能使用c++17,我会使用
无序映射
字符串视图
s

#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"];
}
#包括
#包括
#包括
int main(){
数组字符串={“Foo”,“Bar”};
std::无序地图;
对于(int i=0;i!=strings.size();++i)
map[strings[i]]=i;
标准::cout
我的字符串最多为4个字符,ascii null不是有效值

使用此条件,您可以将字符串转换为整数,并使用最喜欢的编译时整数到整数映射

例如,使用
开关

#包括
#包括
名称空间详细信息{
constexpr std::uint64_t string_as_int(const char*string)noexcept{
标准::uint64_t结果=0;
标准:uint64_t i=0;
对于(;i<4&&*string;++string,++i){
结果|=静态_转换(静态_转换(*字符串))
我的字符串最多为4个字符,ascii null不是有效值

使用此条件,您可以将字符串转换为整数,并使用最喜欢的编译时整数到整数映射

例如,使用
开关

#包括
#包括
名称空间详细信息{
constexpr std::uint64_t string_as_int(const char*string)noexcept{
标准::uint64_t结果=0;
标准:uint64_t i=0;
对于(;i<4&&*string;++string,++i){

结果|=静态_转换(静态_转换(*字符串))是的,有更好的东西:你的C++书籍将解释在C++中解释如何使用C++库的代码> STD::MAP< /COD>和::图和 STD::无序的映射模板。这太长了,不能在StAccOffFuffer.com的简短回答中得到充分解释,所以在C++的书中,你最好全面地讨论这个主题。如果你事先知道所有的字符串,你可以构造一个最小完美的哈希函数。@Hasturkun的答案需要一些阅读。因此,请阅读书籍!没有人会为其编写代码。出于某种原因,我错过了允许constexpr进入案例标签的内容。这是一种非常好的技术。出于某种原因,我错过了允许constexpr进入案例标签的内容。这是一种非常好的技术。