42-3-라.min,max

min, max는 두 값 중 큰 값과 작은 값을 조사한다. C 라이브러리에도 동일한 이름의 매크로 함수가 정의되어 있지만 STL의 min, max는 템플릿 버전이라는 점에서 좀 더 우월하다.

 

const T& min(const T& x, const T& y [, BinPred F]);

const T& max(const T& x, const T& y [, BinPred F]);

 

인수로 비교 대상이 되는 두 값을 전달받는데 마지막 인수로 조건자를 지정할 수 있다. 크다, 작다라는 비교 연산은 지극히 단순한 개념이지만 사용자 정의 타입에서는 이런 간단한 비교조차도 다른 의미를 가질 수 있으므로 조건자가 비교하도록 할 수 있다. 다음 두 함수는 반복자 구간에서 가장 큰 요소, 가장 작은 요소를 찾아 반복자를 리턴한다.

 

FwdIt min_element(FwdIt first, FwdIt last[, BinPred F]);

FwdIt max_element(FwdIt first, FwdIt last[, BinPred F]);

 

최대, 최소값을 찾기 위해 전체를 정렬한 후 first와 last-1 위치를 읽을 수도 있다. 그러나 고작 하나의 값을 찾는데 쓰기에 정렬은 너무 비싼 알고리즘이므로 이럴 때는 이 함수들을 쓰는 것이 좋다. 순차 검색 방법을 사용하므로 반복자 구간은 굳이 정렬되어 있지 않아도 상관없고 임의 접근 반복자일 필요도 없다. 아주 간단한 함수들이므로 예제만 만들어 보자.

 

: minmax

#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

 

void main()

{

     int i=3,j=5;

     printf("둘 중 작은 값은 %d이고 큰 값은 %d이다.\n",min(i,j),max(i,j));

 

     int ari[]={49,26,19,77,34,52,84,34,92,69};

     vector<int> vi(&ari[0],&ari[10]);

     printf("벡터에서 가장 작은 값은 %d이고 가장 큰 값은 %d이다.\n",

          *min_element(vi.begin(),vi.end()),*max_element(vi.begin(),vi.end()));

}

 

정수값 둘의 대소를 비교해 보았고 정수 벡터에서 가장 큰 값과 작은 값을 검색해 보았다.

 

둘 중 작은 값은 3이고 큰 값은 5이다.

벡터에서 가장 작은 값은 19이고 가장 큰 값은 92이다.

 

진짜 인간적으로 너무 너무 쉬운 함수들이다. STL에 이렇게 착한 함수들만 있다면 배우기 정말 쉬울텐데 말이다.