본문 바로가기
Programming/Tips(C++,C#)

Chapter 8. STL함수-객체

by 곰네Zip 2014. 10. 24.

*이 포스팅은 개인 학습을 위해 내용을 정리한 것이 목적입니다.

 

8.1 함수-객체의 개념.

 -함수 객체는 ()연산자를 정의한 객체임.

 -함수객체의 3가지 장점

  1) 함수객체는 상태를 가질 수 있다. 같은 함수 객체에 대해 동시에 다른 상태를 가질 수 있음

  2) 각각의 함수 객체는 자신만의 타입을 가지므로, 함수 객체의 타입을 템플릿의 인자로 제공가능함.

  3) 함수객체는 함수포인터보다 빠르다.

 

 8.1.1 정렬 기준으로서의 함수객체

   특정 클래스에 대해 정렬하여 가지고 있는 컨테이너가 필요할 수 있다. 이 경우 특정 클래스에 특정한 정

  렬 기준을 적용하여 가지고 있으려면 함수 객체를 사용하면 된다.

 

 8.1.2 내부 상태를 가지는 함수 객체

   함수 객체는 reference가 아닌 value로 전달된다. 알고리즘에서 함수 객체 내부의 상태를 변경시키지 않

  는. 만약 내부 상태를 변경하고 싶을 경우에는 레퍼런스로 전달하거나 for_each()알고리즘의 반환 값

  이용하는 두가지 방법이 있다.

   - 함수 객체를 레퍼런스로 전달하기 위해서는 템플릿의 인자를 명시적으로 선언해야 함.

 

 8.1.3 for_each()의 반환 값

   for_each()는 다른 알고리즘과 다르게 함수객체를 반환한다.

 

 8.1.4 조건자와 함수객체

   조건자는 boolean을 반환하는 함수 또는 함수객체임. 알고리즘의 구현방식이 알고리즘이 동작하는 동안

  조건자들의 내부적인 복사본을 생성한다. 그에 따라 조건자가 함수 객체로 넘어갈 경우 함수객체의 복사본

  을 사용한다.

 

8.2 미리정의된 함수-객체

 *STL에 미리 정의된 함수객체

 

 8.2.1 함수 어댑터

  -함수어댑터 : 함수-객체를 특정값 또는 특정 함수와 결합시킨 함수 객체

  -미리 정의된 함수 어댑터

  -기능적 조합법 : 함수 어댑터는 스스로 함수-객체가 됨. 함수 어댑터를 사용하여 다른 함수객체들을 결합할 수 있음

 

 8.2.2 멤버 함수를 위한 함수 어댑터

  -C++ 표준 라이브러리에는 컬렉션의 각각의 원소에 대해 멤버함수를 호출하는 어댑터제공

  -멤버 함수에 대한 함수 어댑터   

 표현식

 효과

 mem_fun_ref(op)

 객체에 대해서 멤버함수 op()를 호출

 mem_fun(op)

 객체의 포인터에 대해 멤버함수 op()를 호출

 

    -mem_fun_ref의 목적 : 각 객체에 대해 멤버함수 호출이 불가하여 해당 어댑터를 사용하여 알고리즘에 멤

  버함수를 전달해주기 위함

 

 8.2.3 기존의 함수를 위한 함수 어댑터

  - 기존 함수를 함수객체와 사용할 수 있도록 해주기 위함

  - 표현식 

 표현식

 효과

 ptr_fun(op)

 *op(param)

 *op(param1, param2)

 

 8.2.4 함수어댑터를 위한 사용자 정의 함수-객체

  - 사용자가 정의한 함수 객체를 어댑터와 같이 사용하려면 몇가지 조건을 만족시켜야 함.

    작성한함수 객체들은 함수객체의 인자와 결과를 위해 타입 멤버를 제공하여야 함. 이를 위해 C++표준 라

    이브러리에서는 unary_function, binary_function 구조체를 제공한다. 사용자는 위 구조체를 상속받아 함

    수객체를 만들어 쉽게 어댑터와 함께 동작할 수 있도록 만들 수 있다.

    *구조체 형태

 unary function

binary function 

 template<class Arg, class Result>

 struct unary_function{

   typedef Arg argument_type;

   typedef Result result_type;

};

 template<class Arg1, class Arg2, class Result>

 struct binary_function{

    typedef Arg1 first_argument_type;

    typedef Arg2 second_argument_type;

    typedef Result result_type;

}

 

 

 

8.3 조립함수-객체

 - 조립함수-객체는 기존의 다른 컴포넌트에서 새로운 컴포넌트를 만들고자 할경우 매우 유용하게 사용할

  수 있다.

 - 유용하게 사용할 수 있는 조립함수-객체들

   i) f(g(elem))

     가장 일반적인 단항 조립함수 형태. 단항 조건자의 중첩 호출을 허용. elem을 사용하는 g의 결과를 f

    입력으로 사용. 단항 조건자처럼 행동

     예)

 

   ii) f(g(elem1, elem2))

     elem1 elem2를 이항조건자 g의 인자로 전달하고, 그 결과를 f의 입력으로 사용. 전체 표현식은 이항조

    건자처럼 행동

   iii) f( g(elem), h(elem))

     elem을 두개의 다른 조건자 g(), h()에 전달하고 이 결과를 f의 입력으로 사용. 조립된 함수에 하나의 인

    자를 주입하는 형태. 단항조건자처럼 행동함.

 

 

   iv) f(g(elem1), h(elem2))

     elem1, elem2를 두개의 다른 조건자 g(), h()에 전달하고 결과를 f의 입력으로사용. 조립된 함수에 인자

    를 분배하는 형태. 이항조건자처럼 행동함.

 

 

참조 : C++ Standard Library - A tutorial and Reference

반응형

댓글