/**
* @brief Copy a sequence, replacing each value for which a predicate
* returns true with another value.
* @param first An input iterator.
* @param last An input iterator.
* @param result An output iterator.
* @param pred A predicate.
* @param new_value The replacement value.
* @return The end of the output sequence, @p result+(last-first).
*
* Copies each element in the range @p [first,last) to the range
* @p [result,result+(last-first)) replacing elements for which
* @p pred returns true with @p new_value.
*/
template<typename _InputIterator, typename _OutputIterator,
typename _Predicate, typename _Tp>
_OutputIterator
replace_copy_if(_InputIterator __first, _InputIterator __last,
_OutputIterator __result,
_Predicate __pred, const _Tp& __new_value)
{
// concept requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
__glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
typename iterator_traits<_InputIterator>::value_type>)
__glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
typename iterator_traits<_InputIterator>::value_type>)
__glibcxx_requires_valid_range(__first, __last);
for ( ; __first != __last; ++__first, ++__result)
if (__pred(*__first))
*__result = __new_value;
else
*__result = *__first;
return __result;
}
replace_copy_if ... 너무나 명확하다. predicate 가 true 인 값에 대해선 주어진 값으로 하고, 그렇지 않을 경우 source container 에 있는 값으로 해서 새로운 container 로 복사하는... 지금까지는 책으로 보거나 이름으로 유추하여 생각했는데, 확 와 닿지는 않았다. 그런데 위의 코드를 보니 그 느낌이 정말로 명확히 다가온다. 물론 predicate 는 요소에 대한 함수객체일테니 이 얼마나 아름답단 말인가. 추상화되기에 확장성이 있고 범용적이면서도 깔끔하고, 명확하니 말이다.
'컴퓨터 > 전산, 그 외' 카테고리의 다른 글
자바의 garbage collector가 파일을 곧바로 닫지 않는 문제 (0) | 2011.03.21 |
---|---|
웹페이지 마우스 오른쪽 클릭을 막아야 하는가? (1) | 2011.02.25 |
프로그램에 익숙해지기 (1) | 2010.11.05 |
컴퓨터 언어를 배워 볼 필요 (0) | 2010.10.06 |
스크립트 언어, 좋더라 (0) | 2010.09.29 |