我们如何将这个if语句转换为" switch"

时间:2014-08-19 15:23:27

标签: c++ if-statement switch-statement

说我们有以下if-statement

if (arg.compare("abc") == 0)
{
...
}

如果我想将其转换为switch形式,则以下是正确的吗?

switch (arg)
{
case "arg.compare("abc") == 0: cout<<"statements the same";
break;
}

感谢。

2 个答案:

答案 0 :(得分:1)

如果有可能出现以下开关声明:

switch (arg)
{
    case arg.compare("abc1") == 0: cout << "statements the same1";
    break;
    case arg.compare("abc2") == 0: cout << "statements the same2";
    break;
}

它将完全等于以下if语句(你想要一个break语句吗?):

if(arg.compare("abc1") == 0) cout << "statements the same1";
// no break is needed
else if(arg.compare("abc2") == 0) cout << "statements the same2";
// no break is needed

这真的等于:

if(arg.compare("abc1") == 0)
{
    cout << "statements the same1";
}
else if(arg.compare("abc2") == 0)
{
    cout << "statements the same2";
}

if-else语句的工作原理与你想要的完全一致,因为如果其中一个是真的,它就不会检查下一个条件。

答案 1 :(得分:1)

如果您静态地知道字符串集(在开发时,例如因为它是一组已知的关键字或标识符),您可能希望使用perfect hash生成器gperf

如果使用C ++ 11进行编码,您还可以制作匿名mapfunctions

  std::map<std::string, std::function<void(const std::string&)> 
   funmap = {
    { "abc", [&](const std::string& name) 
                { std::cout << name; } },
    { "cde", [&](const std::string& name) 
                { do_something_with(name); } },
   };

稍后你会做类似

的事情
   auto it = funmap.find(somestring);
   if (it != funmap.end()) it->second(somestring);