【问题标题】:How can I concisely compare a single variable to many different values?如何简明地将单个变量与许多不同的值进行比较?
【发布时间】:2011-07-19 12:03:50
【问题描述】:

我知道你可以这样写:

if (num1 != a && num1 != b && num1 != c ..........&& num1 != z)
   (do something);

但是有没有更简单的方法可以将 num1 变量与其他 26 个变量进行比较?有点像:

if (num1 != a,b,c,d,e,f,g.......)
   (do something);

【问题讨论】:

    标签: c++ comparison shortcut


    【解决方案1】:

    如果 a..g 是连续的常量/枚举值,则只需使用范围检查。

    if (num >= a && num <= g)
    {
        do_something();
    }
    else
    {
        do_something_else();
    }
    

    如果它们不连续但恒定,则可以使用 switch 语句。

    switch (num)
    {
        case a:
        case b:
        case c:
        case d:
        case e:
        case f:
        case g:
            do_something();
            break;
    
        default:
            do_something_else();
            break;
    }
    

    否则,如果它们只是任意变量或表达式,那么您可能只需要进行多次测试即可。

    【讨论】:

    • 我喜欢这个方法,现在是在num不匹配任何情况下运行默认语句吗?
    • @Dave Fraser: 是的,default 是一个“catch all”,它处理num 的所有没有明确大小写的值。
    • @Paul R 非常感谢这对我有帮助。
    • @Dave:如果答案解决了您的问题,请使用左侧的勾号接受是正确的。
    • @Martin:他确实说过,“如果他们保持不变”
    【解决方案2】:

    您可以将a, ... ,z 放入std::set,然后使用该集合的find 方法检查num1 是否在其中。这具有对数复杂性,但不允许短路。

    【讨论】:

    • 另外,如果您有适合您的数据类型的良好散列算法(或者您只使用原始类型),std::unordered_set 会以恒定的复杂性提供此算法。
    • @ildjarn: std::unordered_set 仅存在于 C++0x 中。在此之前,您必须使用boost::unordered_set
    • 为了简洁起见,只省略了通常的std::/std::tr1::/boost:: 免责声明。 :-]
    【解决方案3】:

    首先,好的代码设计不应该包含这么多条件序列。

    如果您的情况正是如此,那就是尝试查看列表中是否存在数字,其中列表实际上是变量的集合。您可以简单地将这些数字输入列表(向量)并执行查找操作。

    【讨论】:

      【解决方案4】:

      如果情况允许,将变量存储在单独的类中。

      如果您的问题更多地是关于 c++ 中是否存在允许使用更小的 if 语句的语法,那么也许可以在问题中更清楚地说明这一点。

      【讨论】:

        【解决方案5】:

        使用 std::find:

        static ValueType values[] = { a, b, ... };
        //  ...
        if ( std::find( begin( values ), end( values ), num )
                == end( values ) )
        

        【讨论】:

          猜你喜欢
          • 2012-01-28
          • 2018-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多