본문 바로가기
컴퓨터/전산, 그 외

아... STL의 algorithm

by adnoctum 2011. 2. 9.

   (이건 잡담). C++ 의 미친듯한 추상화 세계에서, 그 정점은 template, 그리고 meta-programming 이겠지. 너무 추상화되어 작성자만이 즐겁고 그 다른 이용자는 골머리 깨지게 되는 C++의 그 미칠듯한 추상화 속에, 사용자와 작성자 모두에게 즐거움을 주는 것은 STL 정도. 오래간만에 STL source code 를 보았다... !!!


 /**

   *  @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 는 요소에 대한 함수객체일테니 이 얼마나 아름답단 말인가. 추상화되기에 확장성이 있고 범용적이면서도 깔끔하고, 명확하니 말이다.