for_each

  • for_each 알고리즘은 컨테이너 내 각 요소를 인자로 함수를 호출

  • 컨테이너의 각 요소를 제곱하는 경우의 예제

  • 함수를 인자로 넘기는 방법

    • functor
    • fuction pointer
    • lamda expression

알고리즘 예시 - Functor(함수처럼 사용 가능한 객체)

  • 함수(처럼 사용 가능한) 객체
    • () 연산자의 오버로딩
    #include <iostream>
    

    struct Func //Functor의 정의
    {
        void operator()(int x)// ( ) 연산자 오버로딩
        {
            std::cout << x*x << " ";
        }   
    };

    int main()
    {
        Func f;//Fucntor 객체 생성 가능
        //f.operator()(3); /컴파일러 입장에서 f(3)과 같다
                           //f[3] --> f.operator[](3) 해석 함
        
        f(3);//즉,객체지만 함수처럼 사용이 가능하다

        return 0;
    }

사용 예시

    #include <iostream>
    #include <vector>
    #include <set>

    struct Func //Functor의 정의
    {
        void operator()(int x)// ( ) 연산자 오버로딩
        {
            std::cout << x*x << " ";
        }   
    };

    int main()
    {
        std::vector<int> vec{1,3,7,4,8,10};
        std::set<char> mySet{'A','B','D'};

        Func f;
        std::for_each(vec.begin(),vec.end(),f);

        return 0;
    }

각 요소의 값이 제곱이 되어 출력된다.

Function Pointer 사용

  • 함수의 주소값을 인자로 전달
  • square() 와 square의 차이?
    • 함수의 호출 / 함수의 주소 값
    void f(int x)
    {
        std::cout << x * x << std::endl;
    }

    int main()
    {
        std::vector<int> vec{1,3,7,4,8,10};
        std::set<char> mySet{'A','B','D'};

        //f(10);//100 호출 
        
        std::cout << f << std::endl; // 함수 f가 저정된 메모리의 주소 값 출력

        std::for_each(vec.begin(),vec.end(),f);

    }

함수의 이름은 ‘함수의 포인터’이다. 즉, 함수 f를 출력해 보면 알수없는 주소 값이 출력되는데 이 주소 값은 해당 함수가 메모리에 저장된 위치의 주소 값이다. 해당 주소 값을 for_each의 마지막 요소로 넣으면 위와 같이 각 요소의 값이 제곱이 되어 출력된다.

Lambda expression

  • 익명 함수
  • 함수에 이름을 부여하지 않고, 한번 사용하고 버리는 함수 구현에 사용
    • 우리가 함수의 이름을 붙이는 것은 계속 재 사용하기 위함이다!
    int main()
    {
        std::vector<int> vec{1,3,7,4,8,10};
        std::set<char> mySet{'A','B','D'};

        

        std::for_each(vec.begin(),vec.end(),
        [](int x) //익명 함수 구현하여 인자로 넘겨 버린다.
        {
           std::cout << x*x << std::endl; 
        });

    }

즉, 한번 사용하고 버릴 함수는 굳이 모듈화 시켜서 사용할 필요가 없다! 이름을 붙이고 함수를 구현하는 것 자체가 메모리의 낭비다.

profile
개발로그

0개의 댓글