문제풀이(Problem Solving)/C++ 문제풀이에 유용한 것들

컨테이너 원소들의 최대, 최소 그리고 최대 최소 비교

게임이 더 좋아 2021. 6. 7. 16:44
반응형
728x170

 

std::max_element, std::min_element, std::minmax_element

 

#include<algorithm> 을 필요로 한다.

 

일반적으로 max(a,b) min(a,b)는 2개의 대해서만 최대 최소를 반환하지만

아래는 컨테이너에서 최대 최소를 반환한다.

 

최대 최소를 구하는 것들이다.

 

예를 들어 이렇게 쓸 수 있다.

min만 원하면 min만 쓰고 max만 원하면 max만 쓰면 된다.

 

아래 예시는 최대값이다.

 

기본 형태 

이 아래 2가지가 제일 많이 쓰일 듯 하다.

max_element( ForwardIt first, ForwardIt last );

max_element( ForwardIt first, ForwardIt last, Compare comp );

 

++여기서 fitst는 닫힌 구간이고 last는 열린 구간이다.

-> [1, 9)인 정수면 1,2,3,4,5,6,7,8 이란 뜻이다.

** 벡터의 end()는 마지막 원소 뒷부분을 가리키기 때문에 벡터의 모든 원소가 포함될 수 있는 것이다.

 

 

Parameter

대표적으로 3가지 first, last, comp가 보인다.

 

first, last는 iterator로 범위를 제한을 하고

comp는 bool function이 대부분이다.

true인 값이라는 조건을 다는 것이다.

**이것은 활용도가 높기에 익혀둘 필요가 있을 것 같다.

 

#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>
 
static bool abs_compare(int a, int b)
{
    return (std::abs(a) < std::abs(b));
}
 
int main()
{
    std::vector<int> v{ 3, 1, -14, 1, 5, 9 }; 
    std::vector<int>::iterator result;
 
    result = std::max_element(v.begin(), v.end());
    std::cout << "max element at: " << std::distance(v.begin(), result) << '\n';
 
    result = std::max_element(v.begin(), v.end(), abs_compare);
    std::cout << "max element (absolute) at: " << std::distance(v.begin(), result) << '\n';
}

 

max element at: 5
max element (absolute) at: 2

 

return 값으로 Iterator를 반환한다.

-> 값을 원한다면 포인터 변수가 가리키는 값을 추출할 때 쓰는 *이 필요하다

 

**똑같은 것이 있으면 먼저 나온 것의 위치를 반환

**비어있는 범위면 last를 반환

 

배열 또한 마찬가지이다. 값을 원한다면 *이 필요하다.

 

int result = *max_element(arr , arr + 10000);

위와 같이 pointer의 값을 반환해야하기에 저런 식으로 써야한다.

 

728x90
반응형
그리드형