|
Effective STL 항목 39 를 보면 Predicate 를 순수 함수(pure function)으로 만들어라...
라고 합니다...
하지만 순수 함수로 만들면 객체는 자기 정보를 가질수 있고 이를 관리 할 수 있어야 할텐데 그 장점이
없어 지는 것이 아닐까요?
책에 나와 있는 예제 입니다.
class BadPredicate : public unary_function<Widget, bool>
{
public:
BadPredicate() : timesCalled(0) {}
bool operator()(const Widget&)
{
return ++timesCalled == 3;
}
private :
size_t timesCalled;
}
vector<Widget> vw;
...
vw.erase(remove_if(vw.begin(), vw.end(), BadPredicate()), vw.end());
이렇게 하면 세번째 Widget 객체 뿐만 아니라 여섯번재 Widget 객체 까지 없애 버린다고 합니다.
아무리 생각을 해봐도 세번째만 없어 질꺼 같은데... 이부분 설명해 주실수 있나요.
remove_if 에 대한 필자의 간단한 표현 입니다.
template <typename FwdIterator, typename Predicate>
FwdIterator remove_if(FwdIterator begin, FwdIterator end, Predicate p)
{
begin = find_if(begin, end, p);
if(begin == end) return begin;
else {
FwdIterator next = begin;
return remove_copy_if(++next, end, begin, p);
}
}
술어 구문을 만들때 항상 순수 함수로 만들라고 필자는 강조하는데 ... 그 예를 보이지 않고 장을 끝내버리더군요.
머리가 짧은 관계로 이해를 못하고 있답니다.
순수 함수 처럼 만들면... 함수자의 특성을 못살리는 것 아닌가요?
혹시 이장에 대해 알고 있다면 답변 부탁드립니다.
그럼 좋은 하루 되세요.
|