用于表达"支配地位的元功能"一个序列比另一个序列

时间:2014-12-01 22:55:10

标签: c++ template-meta-programming

我正在寻找可以使用或组合的单个元函数(例如std::less_equal)来表达支配关系,定义如下。

如果出现以下情况,则序列A支配另一个序列B(两者具有相等的长度):

  1. A的每个元素不小于相应的元素B
  2. A的至少一个元素大于B
  3. 的对应元素

    到目前为止,我能够提出的最好成绩包括两个单独的测试,一个接一个,如下所示。

    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>() );
    }
    

    是否可以使用单个元函数执行相同操作?

1 个答案:

答案 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;
}