我是个新手,所以请对我宽容一些。我想知道是否有一种方法可以缩短这些 if 语句链,就像下面在 C++ 中所示的那样。
int offset;
string S;
cin >> S;
if(S == "mon")
{ offset = 0; }
else if(S == "tues")
{ offset = 1; }
else if(S == "wed")
{ offset = 2; }
else if(S == "thurs")
{ offset = 3; }
else if(S == "fri")
{ offset = 4; }
else if(S == "sat")
{ offset = 5; }
else if(S == "sun")
{ offset = 6; }
std::map
。
std::map<std::string, int> m {
{"mon", 0}, {"tues", 1}, {"wed", 2}, {"thurs", 3},
{"fri", 4}, {"sat", 5}, {"sun", 6}
};
std::string s;
std::cin >> s;
int offset = m.at(s);
如果
s
不是有效密钥,则会抛出 std::out_of_range 异常。您可以通过在循环中放置一个 try 块并收集输入来处理这个问题,直到获得有效的密钥,如下所示。
#include <iostream>
#include <stdexcept>
#include <map>
int main() {
std::map<std::string, int> m {
{"mon", 0}, {"tues", 1}, {"wed", 2}, {"thurs", 3},
{"fri", 4}, {"sat", 5}, {"sun", 6}
};
std::string s;
while (true) {
try {
std::cin >> s;
int offset = m.at(s);
std::cout << offset << std::endl;
break;
}
catch (std::out_of_range e) {
std::cerr << "Invalid input: " << s << std::endl;
}
}
return 0;
}
您也可以重构原始代码以使用
? :
(实际名称有些争议)。当然,这需要我们提供else
的案例,所以就用-1
吧。
int offset =
s == "mon" ? 0 :
s == "tues" ? 1 :
s == "wed" ? 2 :
s == "thurs" ? 3 :
s == "fri" ? 4 :
s == "sat" ? 5 :
s == "sun" ? 6 : -1;