for_each 알고리즘은 컨테이너 내 각 요소를 인자로 함수를 호출
컨테이너의 각 요소를 제곱하는 경우의 예제
함수를 인자로 넘기는 방법
#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;
}
각 요소의 값이 제곱이 되어 출력된다.
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의 마지막 요소로 넣으면 위와 같이 각 요소의 값이 제곱이 되어 출력된다.
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;
});
}
즉, 한번 사용하고 버릴 함수는 굳이 모듈화 시켜서 사용할 필요가 없다! 이름을 붙이고 함수를 구현하는 것 자체가 메모리의 낭비다.