항상 원하는 것을 가장 잘 나타내는 변형을 사용하십시오 . 그건
의 각 요소 x
에 대해 vec
수행하십시오 bar.process(x)
.
이제 예제를 살펴 보겠습니다.
std::for_each(vec.begin(), vec.end(),
std::bind1st(std::mem_fun_ref(&Bar::process), bar));
우리는 for_each
거기에 yippeh도 있습니다. 우리는 우리가 [begin; end)
운영하고 싶은 범위를 가지고 있습니다 .
원칙적으로, 알고리즘은 훨씬 더 명시 적이 어서 수작업으로 구현 한 것보다 선호됩니다. 그러나 ... 바인더? 멤펀? 기본적으로 멤버 함수를 얻는 방법에 대한 C ++ interna? 내 임무 에는 신경 쓰지 않는다 ! 이 장황하고 소름 끼치는 구문으로 고통 받고 싶지도 않습니다.
이제 다른 가능성 :
for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
bar.process(*it);
}
물론 이것은 인식 할 수있는 일반적인 패턴이지만 반복자 생성, 반복, 증분, 역 참조가 있습니다. 이것들도 내 임무를 완수하기 위해 내가 좋아하지 않는 모든 것 입니다.
틀림없이, 그것은 (적어도, 루프 waay 더 나은 최초의 솔루션보다 보이는 몸이 유연하고 매우 명시 적이다), 여전히, 정말 아니에요 것이 좋아요. 우리는 더 나은 가능성이 없다면 이것을 사용할 것이지만 아마도 우리는 ...
더 좋은 방법?
이제로 돌아갑니다 for_each
. 말 그대로 말을 잘하지 않을까요 for_each
및 도 수행되어야하는 작업에 유연하게? 다행히도 C ++ 0x 람다이므로
for_each(v.begin(), v.end(), [&](const Foo& x) { bar.process(x); })
많은 관련 상황에 대한 추상적이고 일반적인 솔루션을 찾았 으므로이 특별한 경우에는 절대적으로 # 1 좋아하는 것이 있습니다 .
foreach(const Foo& x, vec) bar.process(x);
실제로는 그보다 훨씬 명확하지 않습니다. 고맙게도 C ++ 0x는 비슷한 문법이 내장되어 있습니다 !
map(bar.process, vec)
, 부작용에 대한 맵은 권장되지 않으며 맵보다 목록 이해 / 생성기 표현식이 권장 됨).