Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ 팁&트릭
[10] [STL]copy_if 알고리듬의 구현
김백일 [cedar] 5539 읽음    2002-05-22 03:13
안녕하세요! 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;
}






+ -

관련 글 리스트
10 [STL]copy_if 알고리듬의 구현 김백일 5539 2002/05/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.