我正在寻找可以使用或组合的单个元函数(例如std::less_equal
)来表达支配关系,定义如下。
如果出现以下情况,则序列A支配另一个序列B(两者具有相等的长度):
到目前为止,我能够提出的最好成绩包括两个单独的测试,一个接一个,如下所示。
template<typename T>
bool dominates( T& sequence1 , T& sequence2 )
{
if( std::equal( sequence1.begin() , sequence1.end() , sequence2.begin() ) ) return false;
return std::equal( sequence1.begin() , sequence1.end() , sequence2.begin() , std::less_equal<double>() );
}
是否可以使用单个元函数执行相同操作?
答案 0 :(得分:2)
单程代码的问题在于你必须保持状态 - 你必须记住你是否遇到了支配元素。
当您知道结果为for
时,编写一个简单的false
循环会给您带来短路的优势。但如果你想要一个单行班,那你就去吧:
template<typename T>
bool dominates2(const T& sequence1, const T& sequence2) {
return std::inner_product(std::begin(sequence1), std::end(sequence1),
std::begin(sequence2), 0,
// this accumulates the result
[](int prevCmp, int curCmp){ return prevCmp > 0 ? prevCmp : (curCmp > 0 ? curCmp : prevCmp + curCmp); },
// this compares corresponding elements of ranges
[](const auto& a1, const auto& a2){ return (a1 > a2) - (a2 > a1); }) < 0;
}