STL foreach 정말 편합니다. for 쓰고 iterator 쭈욱 써야하는걸 라인 하나로 쭉 줄여주기도 하죠.
비슷하게 count_if나 transform과 같은 함수도 코딩 효율성을 높여 줍니다.
가령 아래와 같이 코드를 줄여줄 수도 있죠.
bool equal_ten(int x)
{
if(x == 10)
return true;
else
return false;
}
int num[] = {0,1,2,3,10,5,10};
int cnt = count_if(num, num+7,equal_ten); // 10이 몇개 있는지 개수 출력
cerr << "Cnt:" << cnt << endl; // 10이 몇개 있는지 개수 출력
그런데 아쉬운점이 있습니다. 코드 효율성을 높이는 관점에서 볼 때, equal_ten을 일일이 정의하는게 여간 불편하지 않습니다.
STL에 있는 equal_to 같은 함수를 쓰려해도, 해당 함수가 인자를 두개 받기 때문에 foreach 같은 함수에서는 쓸 수가 없죠.
(해당 함수의 세번째 인자로는 ARGUMENT를 하나만 받는 unary_function이 와야합니다. 그렇지 않으면 컴파일이 안됩니다.)
이때, 필요한게 bind함수 입니다.
bind 함수를 쓰면 위와 같이 재정의할 필요 없이 아래 한 줄로 해결이 됩니다.
int num[] = {0,1,2,3,10,5,10};
int cnt = count_if(num, num+7,bind1st(equal_to<int>(),10));
위의 bind1st를 뜯어보자면 equal_to<int> 함수의 첫번째 인자로 10을 넣어준 함수 오브젝트를 리턴해 줍니다.
따라서 count_if 입장에서 보자면 변수가 하나밖에 없는 equal_to<int>(10, int a) 가 세번째 인자로 들어오게 된거죠.
(즉 문법에 맞는 unary_function 오브젝트가 세번째 인자로 들어오죠)
따라서 count_if는 num을 돌면서 *num 값을 넣어준 euqal_to<int>(10,*num)을 매번 호출하게 됩니다.
그리고 컴파일도 잘 되고요.
bind1st 함수는 이런 동작을 합니다.
(bind2nd 함수도 있습니다. bind1st가 함수의 첫번째 인자로 값을 넣는다면, bind2nd는 두번째 인자로 넣어 줍니다. 위에서 bind2nd를 썼다면 결과적으로는 같은 동작을 하지만 실제는 eqaul_to<int>(int a, 10)과 같이 함수가 전달되겠죠)
자세한 레퍼런스는 아래를 참고하세요~
http://www.cplusplus.com/reference/std/functional/bind1st/



