[STL] 함수 객체

......·2023년 12월 13일

STL

목록 보기
5/8

STL의 함수객체

  • 함수 객체는 클라이언트가 정의한 동작을 다른 구성 요소에 반영하기 위해 사용
  • functional헤더에 정의 되어 있음

함수 객체

  • 함수자라는 애칭으로 사용
  • operator()연산자를 오버로딩한 클래스 객체

함수 객체의 종류

  1. 일반 함수 객체 : 특정 기능을 수행하는 함수 객체
    • 산술 연산 함수 객체 : 산술 연산 기능을 수행(+, -, *, /, %, negate)
    • 비교 연산 함수 객체 조건자 : 비교 조건자(equal_to, not_equal_to, less, greater, greater_equal, less_equal)
    • 논리 연산 함수 객체 조건자 : 논리 조건자(logical_and, logical_or, logical_not)
  2. 함수 어댑터 : 함수류(함수 객체, 함수, 함수 포인터)를 인자로 받아 다른 함수 객체로 변환
    • 바인더 : 이항 함수 객체를 단항 함수 객체로 변환(bind1st, bind2nd)
    • 부정자 : 함수 객체 조건자를 반대로 변환(not1, not2)
    • 함수 포인터 어댑터 : 함수 포인터를 STL이 요구하는 함수 객체로 변환(ptr_fun)
    • 멤버 함수 포인터 어댑터 : 멤버 함수 포인터를 STL이 요구하는 함수 객체로 변환(mem_fun, mem_fun_ref)
  • 조건자 -> bool 형식을 반환하는 함수류(함수 객체, 함수, 함수 포인터)

함수 객체의 종류의 예시

  • 함수 객체, 함수, 함수 포인터 조건자로 조건을 판단하는 예시
#include <iostream>
using namespace std;

struct LessFunctor // 1. 함수 객체 조건자
{
	bool operator() (int left, int right) const
    {
    	return (left < right);
    }
};

bool LessFun(int left, int right) // 2. 함수 조건자
{
	return (left < right);
}

int main()
{
	bool (*LessPtr)(int, int) = LessFun // 3. 함수 포인터 조건자
    LessFunctor lessFunctor;
    
    cout << lessFunctor(10, 20) << endl; // 함수 객체로 비교
    cout << LessFun(10 ,20) << endl; // 함수로 비교
    cout << cout << LessPtr(10, 20) << endl; // 함수 포인터로 비교
}
  • 각 결과는 모두 1로 같음
  • 어댑터의 인자로 사용되는 함수 객체의 요구사항
    - 단항 함수 객체는 반드시 argument_type, result_type이 정의 되어야함
    • 이항 함수 객체는 반드시 first_argument_type, second_argument_type, result_type이 정의되여ㅓ야함
  • 어댑터는 함수 객체를 다른 함수 객체로 변환할 떄 위 정의 형식을 이용해 변환을 수행

일반 함수 객체

산술 연산 함수 객체

plus<T> 		: 이항 연산 함수자로 +연산
minus<T>		: 이항 연산 함수자로 -연산
multipies<T>	: 이항 연산 함수자로 *연산
divides<T>		: 이항 연산 함수자로 /연산
modules<T>		: 이항 연산 함수자로 %연산
negate<T>		: 단항 연산 함수자로 -연산

비교 연산 조건자

equal_to<T>			: 이항 조건자로 == 연산
not_equal_to<T>		: 이항 조건자로 != 연산
less<T>				: 이항 조건자로 < 연산
less_equal<T>		: 이항 조건자로 <= 연산
greater<T>			: 이항 조건자로 > 연산
greater_equal<T>	: 이항 조건자로 >= 연산

논리 연산 조건자

logical_and<T>	: 이항 조건자로 &&연산
logical_or<T>	: 이항 조건자로 ||연산
logical_not<T>	: 단항 조건자로 !연산
  • 일반적으로 T에 bool타입을 지정

함수 어댑터

바인더

bind1st	: 이항 함수자의 첫 번째 인자를 고정하여 단항 함수자로 변환
bind2st	: 이항 함수자의 두 번째 인자를 고정하여 단항 함수자로 변환

<예시>
binder1st<less<int>> binder = bind1st(less<int>(), 10)
binder2nd<less<int>> binder = bind2nd(less<int>(), 10)
  • 이항 함수자를 단항 함수자로 변환하는 기능

부정자

not1	: 단항 조건자를 반대의 조건자로 변환
not2	: 이항 조건자를 반대의 조건자로 변환

<예시>
binary_negate<less<int>> negate = not2<less<int>())
unary_negate<binder2nd<less<int>>> negate = not1(binder)
  • 조건자를 반대의 조건자로 변환

함수 포인터 어댑터

  • 일반 함수를 어댑터 적용이 가능한 함수 객체로 변환
  • STL은 ptr_fun()이라는 함수 포인터 어댑터를 제공

멤버 함수 포인터 어댑터

mem_fun()		: 객체로 멤버 함수를 호출
mem_fun_ref()	: 객체의 주소로 멤버 함수를 호출

0개의 댓글