C++ 中更清晰的 if 语句序列

问题描述 投票:0回答:1

我是个新手,所以请对我宽容一些。我想知道是否有一种方法可以缩短这些 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; }
c++ if-statement
1个回答
3
投票

我建议使用

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;
© www.soinside.com 2019 - 2024. All rights reserved.