有没有办法检查是否满足所有条件? e.g:
if(num[i] > (*all*)alt[c])
{
}
而不是这样做
if(num[i] > alt[1] && num[i] > alt[2] && num[i] > alt[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 ++的一部分。