Programming/C&CPP

C++ 벡터(vector) 혹은 배열에서 최대값, 최소값 찾기

psychoria 2020. 9. 14. 03:00
반응형

벡터(vector)나 배열 등에 저장된 원소들 중에 최대값과 최소값을 찾아야 하는 경우가 있습니다.

C++에서 제공하는 max_element와 min_element는 각각 최대값과 최소값을 찾을 수 있습니다.

max_element와 min_element를 사용하는 방법을 알아보겠습니다.

 

max_element와 min_element는 algorithm 헤더에 포함되어 있습니다.

최대값과 최소값을 가져오는 예제는 다음과 같습니다.

첫 번째 최대값과 최소값을 가져오는 부분은 배열에서 가져오는 방법입니다.

배열의 첫 번째 값의 주소(변수명)과 마지막 값의 주소 + 1(변수명 + sizeof(변수명) / sizeof(타입))을 전달하면 됩니다.

기본적으로 max_element와 min_element는 이터레이터(Iterator)를 리턴합니다.

그래서 값을 읽을 때는 *연산자로 접근해야 읽을 수 있습니다.

다음으로 벡터(vector)를 통해 최대값과 최소값을 가져올 때는 begin()과 end()를 전달해주면 됩니다.

다른 algorithm의 함수들과 마찬가지로 람다 함수를 통해 임의로 동작할 수 있게 할 수 있습니다.

begin(), end() 다음에 람다 함수를 전달할 수 있습니다.

string 타입을 받아서 int로 변환한 이후에 비교하는 간단한 람다식은 다음과 같습니다.

[](std::string lhs, std::string rhs) { return std::stoi(lhs) < std::stoi(rhs); }

람다를 활용하면 본인이 원하는 임의의 동작으로 최대값과 최소값을 얻을 수 있습니다.

마지막으로 max_element와 min_element가 빈 컨테이너를 전달받는 경우에 대한 처리가 필요합니다.

두 함수 모두 변수명.end()로 전달하는 값을 리턴해서 빈 컨테이너라는 것을 알 수 있게 해줍니다.

그래서 다음과 같은 if문을 추가해주면 됩니다.

auto minVal = std::min_element(vecEmpty.cbegin(), vecEmpty.cend());
if (minVal == vecEmpty.cend()) {
    // do something
}

간단하게 빈 컨테이너가 전달됐을 경우의 예외를 처리해줄 수 있습니다.

실행 결과

배열, vector, 람다 함수를 통한 결과 모두 동일하게 표시가 되는 것을 확인할 수 있습니다.

C++의 max_element와 min_element를 사용하면 쉽게 최소값과 최대값을 찾아낼 수 있습니다.

반응형