Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ (C+;+;/QT)通过将字符串转换为int来使用带字符串的switch语句_C++_Qt_Switch Statement - Fatal编程技术网

C++ (C+;+;/QT)通过将字符串转换为int来使用带字符串的switch语句

C++ (C+;+;/QT)通过将字符串转换为int来使用带字符串的switch语句,c++,qt,switch-statement,C++,Qt,Switch Statement,在这里,我找到了一种有趣的方法来创建带有字符串的switch语句。然而,这似乎真的很漫长。我想知道是否有可能将一个特定的字符串转换成一个可以在switch语句中使用的整数 所以psuedo代码应该是这样的 QString str = "spinbox_1"; switch stoi( str ) case 1543: //code here case 2343: //code here case 3424: //code here 不,一般来说,不可能将字符串唯一地映

在这里,我找到了一种有趣的方法来创建带有字符串的switch语句。然而,这似乎真的很漫长。我想知道是否有可能将一个特定的字符串转换成一个可以在switch语句中使用的整数

所以psuedo代码应该是这样的

QString str = "spinbox_1";

switch stoi( str )
case 1543:
    //code here
case 2343:
    //code here
case 3424:
    //code here

不,一般来说,不可能将字符串唯一地映射到整数-字符串比整数多。您可以计算两个不同字符串不可能发生冲突的哈希值,然后比较它们,但仍有可能两个不同字符串具有相同的哈希值,因此您必须在检查它们的哈希值后比较这些字符串。这就是
std::unordered_集
std::unordered_映射
的实现方式(也称为hash_集和hash_映射),因此您可以使用它们。但是您不会使用
switch()
语句。

如果我发现自己处于类似的情况,我会使用映射从给定字符串定义特定的int

例如:

// The string you want to convert to an int
std::string myString = "stringTwo";

// The mapping that you set for string to int conversions
std::map<std::string, int> stringToInt = \
    {{"stringOne"  , 1},
     {"stringTwo"  , 2},
     {"stringThree", 3}};

// Here, myInt is define as 2
int myInt = stringToInt[myString];
//要转换为int的字符串
std::string myString=“stringTwo”;
//为字符串到整数转换设置的映射
标准::映射stringToInt=\
{{“stringOne”,1},
{“stringTwo”,2},
{“stringThree”,3};
//这里,myInt定义为2
int myInt=stringToInt[myString];

现在,您可以将myInt放入开关盒。

正如@Slava所述,这是不容易做到的。作者在上述链接中提供的解决方案可能是最实际的解决方案。但如果出于某种原因确实需要以其他方式将字符串转换为十进制数,则可以使用哈希方法。请参考下面广泛使用的cityhash(显然,您可以使用任何其他哈希函数)。

这可能是以下文件的副本:

试着看看这个解决方案:


不幸的是,这个解决方案的描述只能用俄语(至少我找不到英语)。它基于在编译时计算字符串的哈希值。它唯一的限制是支持最大长度为9个字符的字符串。

是否尝试从字符串中生成int并在switch语句中使用它?为什么要这样做?链接的解决方案似乎好得多。显然,QString而不是std::string这正是作者在提供的链接上实现它的方式,也是他想要的avoid@Slava是的,它是一样的。这是一样的,但事后看来,这对我来说更具可读性。因此,如果使用
const char*
s作为
map
的键而不是
string
,则可以将其设置为
constepr
,这意味着它将在编译时构造,使其几乎与
string
s的switch语句一样有效。OP打算将
swich
case
es一起使用,这意味着可能的字符串集在编译时是已知的,并且是有限的。对于任何这样的集合,都可以构造一个函数,将该集合中的字符串映射为唯一的整数。这并不意味着,如果有这样的函数,那么只需在其结果上使用
开关即可。谢谢,我也会尝试一下。散列可能适合我的情况。这真是天才,谢谢