如何使用向量字符串创建 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 相同的值,但它应该有效。