如何使用向量字符串创建 switch 语句?
How to make a switch statement with a vector string?
vector<string> cmdV = split(_cmd, " ");
switch (cmdV[0])
{
}
出于某种原因,它在 cmdV[0]
中给出错误:“该值必须具有整数或枚举类型”
switch
语句在条件和 case
语句上都需要整数类型(后者必须在编译时已知)。如果您要根据字符串的内容设置条件,则必须使用其他内容,例如 if
语句。
如果您必须根据字符串进行大量条件编程,您可以考虑将字符串散列为整数。如果做得好,这可以让您在 switch 中使用 switch 语句比完成完整字符串比较更快。为此,我制作了一个 compile-time version of the SpookyHash algorithm。
如果您真的想用 vector<string>
中的值创建一个 switch 语句,您可以使用 atoi()
或 std::stoi()
。此答案中有更多描述:How can I convert a std::string to int?.
以下代码应该有效:
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<std::string> test;
test.push_back("2");
switch(std::stoi(test[0])) {
case 1:
std::cout << "IT WORKS!";
break;
case 2:
std::cout << "IT WORKS 2!";
break;
}
}
它应该打印 "IT WORKS 2!"
没有错误。
或者如果您希望 std::string str = "Test"
之类的字符串成为其中一种情况,您可以使用 this 上一个问题中的答案:
enum string_code {
eFred,
eBarney,
eWilma,
eBetty,
...
};
string_code hashit (std::string const& inString) {
if (inString == "Fred") return eFred;
if (inString == "Barney") return eBarney;
...
}
void foo() {
switch (hashit(stringValue)) {
case eFred:
...
case eBarney:
...
}
}
注意:您应该稍微阅读一下,确保您了解执行此操作可能会出现的错误。还要阅读不同的数据类型,否则可能会出现这样的错误:wrong result of casting string to int C++
编辑: 正如 @theOtherMichael 在下面的评论中提到的,上面的代码不是“真正的”哈希方法。但是正如在 this post 中发现的那样,有一种方法可以使用相同的想法但实际上对值进行哈希处理。
constexpr unsigned int hash(const char *s, int off = 0) {
return !s[off] ? 5381 : (hash(s, off+1)*33) ^ s[off];
}
switch( hash(str) ){
case hash("one") : // do something
case hash("two") : // do something
}
虽然这里可能发生的是不同的字符串可能 return 相同的值,但它应该有效。
vector<string> cmdV = split(_cmd, " ");
switch (cmdV[0])
{
}
出于某种原因,它在 cmdV[0]
中给出错误:“该值必须具有整数或枚举类型”switch
语句在条件和 case
语句上都需要整数类型(后者必须在编译时已知)。如果您要根据字符串的内容设置条件,则必须使用其他内容,例如 if
语句。
如果您必须根据字符串进行大量条件编程,您可以考虑将字符串散列为整数。如果做得好,这可以让您在 switch 中使用 switch 语句比完成完整字符串比较更快。为此,我制作了一个 compile-time version of the SpookyHash algorithm。
如果您真的想用 vector<string>
中的值创建一个 switch 语句,您可以使用 atoi()
或 std::stoi()
。此答案中有更多描述:How can I convert a std::string to int?.
以下代码应该有效:
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<std::string> test;
test.push_back("2");
switch(std::stoi(test[0])) {
case 1:
std::cout << "IT WORKS!";
break;
case 2:
std::cout << "IT WORKS 2!";
break;
}
}
它应该打印 "IT WORKS 2!"
没有错误。
或者如果您希望 std::string str = "Test"
之类的字符串成为其中一种情况,您可以使用 this 上一个问题中的答案:
enum string_code { eFred, eBarney, eWilma, eBetty, ... }; string_code hashit (std::string const& inString) { if (inString == "Fred") return eFred; if (inString == "Barney") return eBarney; ... } void foo() { switch (hashit(stringValue)) { case eFred: ... case eBarney: ... } }
注意:您应该稍微阅读一下,确保您了解执行此操作可能会出现的错误。还要阅读不同的数据类型,否则可能会出现这样的错误:wrong result of casting string to int C++
编辑: 正如 @theOtherMichael 在下面的评论中提到的,上面的代码不是“真正的”哈希方法。但是正如在 this post 中发现的那样,有一种方法可以使用相同的想法但实际上对值进行哈希处理。
constexpr unsigned int hash(const char *s, int off = 0) { return !s[off] ? 5381 : (hash(s, off+1)*33) ^ s[off]; } switch( hash(str) ){ case hash("one") : // do something case hash("two") : // do something }
虽然这里可能发生的是不同的字符串可能 return 相同的值,但它应该有效。