说我们有以下if-statement
:
if (arg.compare("abc") == 0)
{
...
}
如果我想将其转换为switch
形式,则以下是正确的吗?
switch (arg)
{
case "arg.compare("abc") == 0: cout<<"statements the same";
break;
}
感谢。
答案 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进行编码,您还可以制作匿名map的functions:
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);