안녕하세요! cedar 김백일입니다.
1, 7, 9번에 ANSI C++ STL에 없는 기능이나 알고리듬을 구현하는 팁을 올렸습니다.
이번에도 그런 알고리듬 구현을 소개합니다.
이번 팁은 Effective STL(Scott Meyers 著, 곽용재 譯)의 항목 36에 있는 내용입니다.
간단히 정리해서 올립니다.
이 내용의 저작권은 저자와 역자에게 있습니다.
=================================================================================
ANSI C++ STL에서 copy라는 이름이 붙은 알고리듬은 다음 11개가 있습니다.
copy
copy_n
copy_backward
replace_copy
replace_copy_if
remove_copy
remove_copy_if
reverse_copy
rotate_copy
unique_copy
partial_sort_copy
이 중에 주어진 조건을 만족하는 원소를 복사하는 기능의 알고리듬인
copy_if는 ANSI C++ STL에는 없습니다.
원래 이 copy_if는 ANSI C++ STL의 전신(前身)인 HP STL에는 들어있었던 것이지만,
ANSI C++ 표준화 과정에서 제외되었다고 합니다. -_-;;
즉, ANSI C++ STL의 원칙은 구현하기 쉽다고 생각되는 알고리듬은 제외한다는 것이죠.
5번 팁의 iota 알고리듬도 바로 그런 경우입니다.
또한 제가 이제까지 올린 1, 7, 9번 팁의 경우를 생각해 보면
구현하기가 쉽기 때문에 ANSI C++ STL에 없을 거라는 생각이 듭니다.
그럼 copy_if 알고리듬을 구현해보도록 하겠습니다.
copy 알고리듬은 다음과 같이 구현되어 있습니다.
template<typename InputIterator, typename OutputIterator>
OutputIterator copy(InputIterator begin, InputIterator end, OutputIterator result)
{
while (first != last)
*result++ = *first++;
return result;
}
ANSI C 라이브러리의 strcpy()나 memcpy()의 소스와 거의 유사한 형태입니다.
위의 코드를 다음과 같이 변형하면 copy_if 알고리듬이 됩니다.
template<typename InputIterator, typename OutputIterator, typename Predicate>
OutputIterator copy_if(InputIterator first, InputIterator last, OutputIterator result,
Predicate p)
{
while (first != last) {
if (p(*first)) *result++ = *first;
++first;
}
return result;
}
|