2017-10-09 6 views
-1

를 사용하여 사용자 정의 데이터의 벡터에 최대 및 최소 찾기이 같은 데이터 구조를 가지고있다. 멋진 축을 만들기 위해이 벡터에서 데이터의 최대 값과 최소값을 찾고 싶습니다. 나는 이것을 좋아하지 만, 분명히 set만을 기반으로하기 때문에 어느 지점에서든지 actset보다 작거나 큰 경우 실패 할 것입니다. 차트의 Y 축이 최소 set, act에서 최대 값이 set, act 사이 여야합니다.알고리즘

auto max = std::max_element(begin(data), end(data), 
          [&](const Speed& a, const Speed& b){ 
    return a.set() < b.set(); 
    //how about act? 
}); 

auto min = std::min_element(begin(data), end(data), 
          [&](const Speed& a, const Speed& b){ 
    return a.set() < b.set(); 
    //how about act? 
}); 

는 ** 나는 결과를 달성하기 위해 알고리즘과 람다과 관련이없는 정상적인 코드를 작성하는 방법 ** 알고 ...하지만 난 연산자를하지 않고도 알고리즘/람다와 함께 할 수 방법을 보려면 관심 구조체에 과부화가 발생합니다.

나는 또한 act에 대해 동일한 작업을 수행 한 다음 결과를 비교할 수는 있지만 4 루프가 필요합니다.

+1

비교 기능을 사용하려면 어떻게해야할까요? 가장 작은/가장 큰 세트와 행동을 원하십니까? 평균? 집합과 행동의 합계의 최소/최대 값? 두 값을 비교하는 데는 여러 가지 방법이 있습니다. – Jonesinator

+0

@Jonesinator 두 차트의 값 범위를 모두 커버하기 위해 최소 및 최대 값을 얻고 싶습니다. –

+0

두 속성 (설정, 동작)에 대한 비교 함수를 생성하는 것에 대한 질문입니까? –

답변

1

일반적으로 가장 읽기 쉬운 코드를 권장합니다. (적어도 하나 개의 항목을 가정) 같은

따라서, 볼 수있는 작품 : 데이터가 정말 크거나 논리가 더 복잡한 경우

auto set_minmax = std::minmax_element(begin(data), end(data), 
    [&](const Speed& a, const Speed& b) { return a.set < b.set; }); 

auto act_minmax = std::minmax_element(begin(data), end(data), 
    [&](const Speed& a, const Speed& b) { return a.act < b.act; }); 

auto min_act_set = std::min(*set_minmax.first, *act_minmax.first); 
auto max_act_set = std::max(*set_minmax.second, *act_minmax.second); 

그러나, 내가 축적 객체를 가지고 추천 할 것입니다 통계를 수집하고 데이터에 대해 일종의 루프를 수행합니다.

2

std::min_elementstd::max_element 호출 중에 std::minstd::max을 사용할 수 있습니다.

#include <algorithm> 
#include <iostream> 
#include <vector> 

struct Speed { 
     int set; 
     int act; 
     int millis; 
}; 

int main() { 
    std::vector<Speed> data = { 
     {1, 2, 3}, 
     {4, 5, 6}, 
     {7, 8, 9} 
    }; 

    auto max_val = std::max_element(begin(data), end(data), 
            [](const Speed& a, const Speed& b){ 
     return std::max(a.set, a.act) < std::max(b.set, b.act); 
    }); 

    auto min_val = std::min_element(begin(data), end(data), 
            [](const Speed& a, const Speed& b){ 
     return std::min(a.set, a.act) < std::min(b.set, b.act); 
    }); 

    std::cout << "MAX: " << max_val->set << " " << max_val->act << "\n"; 
    std::cout << "MIN: " << min_val->set << " " << min_val->act << "\n"; 
} 

std::minmax와 하나의 패스는 정말 여기에서 작동하지 않을 수 있습니다. 각 요소의 비교는 부울을 반환해야합니다. true은 왼쪽이 오른쪽보다 작음을 의미하고 false은 왼쪽이 오른쪽보다 크거나 같은 것을 의미합니다 (즉, a 엄격한 약한 주문이 필요함). 그러나 여기에서는 단일 요소가 다른 요소보다 더 작을 수 있습니다 (). 싱글 패스 minmax_element를 만들기 위해 자신 만의 함수를 쉽게 작성할 수는 있지만 두 패스를 작성하지 않고도 기존 STL 함수에 적합하다고는 생각하지 않습니다.

+0

이것이 OP가 원하는 결과라면, 각 멤버에 대해'std :: minmax_element'를 사용하고 이후에 최종 최소값과 최대 값을 얻습니다. 읽기 쉽고 효율적입니다. – Phil1970

+0

일부 변경 https://onlinegdb.com/SJZCyXKhb 그것은 내가 의미했던 것입니다 ...하지만 이것이 단 하나의 루프에서 할 수 있다면 좋을 것입니다 –

+0

나는 하나의 루프 접근 방식이 제대로 처리하지 않을 것이라고 생각합니다. 사례. 예를 들어, 동일한 항목이 하나의 필드에 대한 최소값과 다른 필드에 대한 최대 값인 경우에 작동합니다. – Phil1970