2014-12-01 4 views
1

다음과 같이 정의 된 우성 관계를 표현하기 위해 사용되거나 결합 될 수있는 하나의 메타 함수 (예 : std::less_equal)를 찾고 있습니다.하나의 시퀀스의 "지배"를 다른 것보다 우위로 표현하기위한 메타 함수

시퀀스 A는 만약 다른 시퀀스 B (동일한 길이를 갖는 두) 지배한다 : (A)의 각 요소는 대응하는 요소 B 이상인

  1. (A)의
  2. 적어도 하나 개의 요소가보다 큰 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>()); 
} 

단일 메타 기능을 사용하여 동일한 작업을 수행 할 수 있습니까?

+2

이것은 메타 기능이 아닙니다. –

+0

알아. 'std :: less_equal'이 발생했습니다. – Olumide

+0

이 점을 올바르게 이해한다면 현재 사용하고있는 코드의 최적 버전을 원하십니까? STL이 생성하는 루프를 풀고 두 작업을 병합하면됩니다. – BlamKiwi

답변

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