c ++如果满足所有条件

时间:2014-12-18 21:35:36

标签: c++ if-statement

有没有办法检查是否满足所有条件? e.g:

if(num[i] > (*all*)alt[c])
{
}

而不是这样做

if(num[i] > alt[1] && num[i] > alt[2] && num[i] > alt[3])
{
}

喜欢有更短的路吗?

3 个答案:

答案 0 :(得分:9)

您可以使用合适的辅助功能,它可以有效地调用其中一种算法,例如:

 if (is_bigger(num[i], alts)) {
     // ...
 }

其中函数is_bigger()只使用具有合适条件的std::all_of()

template <typename T, typename Sequence>
bool is_bigger(T const& test, Sequence const& alts) {
    return std::all_of(alts.begin(), alts.end(),
         [&](T const& other){ return test > other; });
}

all_of()是一种简单的算法,它将谓词应用于由开始和结束迭代器(alts.begin()alts.end())分隔的序列中的所有元素。这个函数的另一件事是简单的lambda表达式创建一个相应的谓词。

答案 1 :(得分:7)

好吧,您可以取所有alts的最大值,然后将num[i]与之比较。

获取最大元素:

auto max = std::max_element(alt.begin(), alt.end());

答案 2 :(得分:0)

现在没有,至少没有创建额外的代码(而不是在编译时进行评估)。但是如果你使用'内联'变量(目前只是一个早期的草案 - 我的想法),你可以写:

auto FuncCheckingMulCond(auto &inline varSrc, auto &inline varTarget, inline size_t nTimes)
{
    for(inline size_t i(0); i < nTimes; ++i)
        if(!(varSrc > varTarget[i]))
            return false;

    return true;
}

所以你的例子看起来像这样:

if(FuncCheckingMulCond(num[i], alt, 5))
{
}

内联变量应该是在编译时知道哪个值,并且'FuncCheckingMulCond'包含'inline'参数,它也应该在编译时进行评估。 '&amp; inline'是一个内联引用,这意味着它不是存储一些指针,而是将它所有的实例替换为它绑定的变量。所以从理论上讲 - 上面的代码应该完全符合您的要求,但不幸的是,这还不是ISO C ++的一部分。