Programming/c++

[c++] std::max_element , std::min_element 함수

owls 2022. 9. 16. 20:11
728x90

std::max_element , std::min_element  

max_element(), min_element()는 둘다 모든 요소에 접근을 해야 하기 때문에, 모든 STL 컨테이너에 대해서 선형으로 동작한다. 즉, 시간 복잡도가 O(n)이다.

 

std::max_element , std::min_element  함수 정의

// MAX
template <class ForwardIterator>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last);
  
template <class ForwardIterator, class Compare>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last, Compare comp);

//MIN
template <class ForwardIterator>
ForwardIterator min_element (ForwardIterator first, ForwardIterator last);
  
template <class ForwardIterator, class Compare>
ForwardIterator min_element (ForwardIterator first, ForwardIterator last, Compare comp);

max_element, min_element 리턴 값은 iterator 이다.

 

std::max_element , std::min_element  예제

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

int main() {
	int arr[] = { 1, -2, 0, 9, -1, 2, -10 };
	std::vector<int> vec = { 1, -2, 0, 9, -1, 2, -10 };
	std::list<int> nlist = { 1, -2, 0, 9, -1, 2, -10 };

	auto arr_iter1 = std::min_element(arr, arr + 7);	//-10
	auto arr_iter2 = std::max_element(arr, arr + 7);	//9

	auto vec_iter1 = std::min_element(vec.begin(), vec.end());	//-10
	auto vec_iter2 = std::max_element(vec.begin(), vec.end());	//9
	
   	auto list_iter1 = std::min_element(nlist.begin(), nlist.end());	//-10
	auto list_iter2 = std::max_element(nlist.begin(), nlist.end());	//9
	
	return 0;
}

 

 

std::max_element , std::min_element  활용 ( 절댓값 )

min_element, max_element 의 3번째 argument 로 조건 함수를 쓸 수 있다.

벡터 원소들의 절댓값으로 min, max값인 원소의 주소를 반환한다.

 

<사용 조건>

- comp 함수는  bool타입 함수로, 인수를 수정하면 안된다.

- 함수 포인터 이거나 함수 객체를 매개변수로 사용 가능하다.

- 첫번째 인수가, 두번째 인수보다 작은지 판단하는 알고리즘으로 작성해야한다.

 

comp를 제공하는 함수는 위의 기본적인 틀에 따라, 참과 거짓을 나타내는 custom된 함수를 만들어 사용할 수 있다.

#include <iostream>
#include <algorithm>

bool comp(int i, int j) {	return(std::abs(i) < std::abs(j));	}

int main() {

	std::vector<int> vec = { 1, -2, 0, 9, -1, 2, -10 };

	auto iter_min = std::min_element(vec.begin(), vec.end(), comp);	//0
	auto iter_max = std::max_element(vec.begin(), vec.end(), comp);	//-10
    
	return 0;
}

 

 

728x90