2010-12-15 4 views
1

현재 나는 다음과 유사한 STL 컨테이너의 각 요소를 호출하는 for 루프를 실행하고 있습니다.독립 입력 매개 변수가있는 함수를 사용하여 STL for_each 알고리즘을 사용할 수 있습니까?

void AddToUpdate(iterator iter, Update& Update) {...}; 

... 

Update update; 
for(iterator iter = container.begin(); iter != container.end(); ++iter) 
    AddToUpdate(iter, update); 

나는 내 요구에 맞는 것 같이 for_each STL 알고리즘을보고있다.

컨테이너에 적용되는 함수에 두 번째 입력 매개 변수를 사용하면 멤버 변수 나 다른 허점을 사용하지 않고 표준 STL 알고리즘을 사용하도록 리팩터링 할 수 있는지 궁금합니다. 기본적으로는 두 번째 인수가 고정되어 2 개 인자로 함수에서 단항 함수 객체를 반환 http://www.cplusplus.com/reference/std/functional/bind2nd/

-

답변

4

다양한 std::bind1st/std::bind2ndBoost.bind 라이브러리는 문제를 해결하기 위해 만들어졌지만 (보통 STL 알고리즘을 사용하는 거의 모든 사람들에게 공통적 인 문제임) 해결책이 아닌 해결책으로 보입니다.

다가오는 C++ 표준에서 대망하게 추가 된 lambda functions을 사용하면 문제를 확실히 해결할 수 있습니다. 그러나 std::for_each은 역 참조 된 반복자 (즉, 실제 값이 고려 됨)를 전달하는 함수를 호출하기 때문에 AddToUpdate 함수는 반복기를 허용해서는 안되며 그 값을 받아 들여야합니다. 이러한 경우에

는,이 같은 것입니다 :

Update update; 
std::foreach(container.begin(); container.end(); [ & update](TypeOfTheValue Value) { 
    AddToUpdate(Value, update); 
}); 
+0

또 다른 옵션은 작업을 수행하기위한 펑터를 작성하는 것입니다. 이는 람다 버전과 비슷한 동작을하지만 C++ 0x에 대한 컴파일러 지원은 필요하지 않습니다. – jalf

+1

바인딩의 전체 요점은 펑터를 작성하지 않습니다. –

4

당신은 std::bind2nd()를 사용하고 싶습니다.

Update update; 
for_each(container.begin(), container.end(), bind2nd(ptr_fun(AddToUpdate), update)); 

편집 :

이것은 코드가 for_eachbind2nd와 같이하는 방법입니다. Matteo는 AddToUpdate의 첫 번째 인수가 iterator가 아닌 container에 값 형식이어야한다는 것을 알았습니다.

+1

하지만 그뿐만 아니라 기능에, 표준 : binary_function' '에서 파생 펑에서 작동합니다. –

+2

@Konrad는'std :: ptr_fun'으로 해결할 수 있습니다. –

+1

오른쪽, 편집 됨. 나는'boost :: bind'에 익숙해 져서 얼마나 많은 고통이 순수한 STL인지 잊어 버렸습니다. –