简洁的说法等于C ++中的值集

时间:2016-09-19 08:57:27

标签: c++

例如,我有以下字符串,

if (str[i] == '(' ||
    str[i] == ')' ||
    str[i] == '+' ||
    str[i] == '-' ||
    str[i] == '/' ||
    str[i] == '*')

我的问题是有一个简洁的方法来说明这个值是否是c ++中这些值集合之一?

5 个答案:

答案 0 :(得分:6)

您可以使用特殊字符在字符串中搜索单个字符str[i]std::string("()+-/*").find(str[i]) != std::string::npos

答案 1 :(得分:3)

不光彩,因为它是C而不是C ++,但C标准库总是可以从C ++代码访问,而我作为一个古老的恐龙的第一个想法是:

if (strchr("()+-/*", str[i]) != NULL)

简单紧凑

答案 2 :(得分:2)

您可以使用以下内容:

const char s[] = "()+-/*";

if (std::any_of(std::begin(s), std::end(s), [&](char c){ return c == str[i]})) {
     // ...
}

答案 3 :(得分:0)

这实际上取决于你的应用程序。对于如此小的检查并根据上下文,一个可接受的选项可能是使用宏

#include <iostream>
#define IS_DELIMITER(c) ((c == '(') || \
                         (c == ')') || \
                         (c == '+') || \
                         (c == '-') || \
                         (c == '/') || \
                         (c == '*')    )

int main(void)
{
    std::string s("TEST(a*b)");

    for(int i = 0; i < s.size(); i ++)
        std::cout << "s[" << i << "] = " << s[i] << " => " 
                  << (IS_DELIMITER(s[i]) ? "Y" : "N") << std::endl;
    return 0;
}

更多 C ++ ish 这样做的方法是使用内联函数

inline bool isDelimiter(const char & c)
{
  return ((c == '(') || (c == ')') || (c == '+') || 
          (c == '-') || (c == '/') || (c == '*')   );
}

这篇文章可能很有趣:Inline functions vs Preprocessor macros

答案 4 :(得分:-1)

也许不是“更简洁”,但我认为这种风格在测试时是简洁表达

当然,如果您不止一次使用它,is_arithmetic_punctuation不一定是lambda。它可以是函数或函数对象。

auto is_arithmetic_punctuation = [](char c)
{
  switch(c)
  {
      case '(':
      case ')':
      case '+':
      case '-':
      case '/':
      case '*':
          return true;
      default:
          return false;
  }
};

if (is_arithmetic_punctuation(str[i]))
{
  // ...
}