일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 상속
- UE4
- c++
- exception
- virtual function
- Vector
- 영화 리뷰
- 예외
- reference
- 게임
- 루아
- 티스토리챌린지
- Effective c++
- operator new
- Smart Pointer
- 스마트 포인터
- effective stl
- more effective c++
- 비교 함수 객체
- lua
- resource management class
- 반복자
- 영화
- 오블완
- implicit conversion
- 참조자
- 언리얼
- 암시적 변환
- 메타테이블
- 다형성
Archives
- Today
- Total
스토리텔링 개발자
[Effective STL] 36. copy_if 본문
728x90
항목 36. copy_if를 적절히 구현해 사용하자
copy 알고리즘
- 모던 C++ 이전에는 아래와 같은 copy 알고리즘들만이 있었다.
- copy
- copy_backward
- replace_copy
- reverse_copy
- replace_copy_if
- unique_copy
- remove_copy
- rotate_copy
- remove_copy_if
- partial_sort_copy
- uninitialized_copy
- 즉, copy_if가 없어서 구현해야 했다.
- 어떤 식으로 구현해서 사용했었는지 재미로나마 알아보자.
copy_if가 필요한 상황
bool isDefective(const Widget& w); // Widget이 문제가 있는지 알려주는 함수
vector<Widget> widgets;
...
// c++11 이전에는 이게 안됐다..
copy_if(widgets.begin(), widgets.end(), ostream_iterator<Widget>(cerr, "\n"), isDefective);
copy_if를 '대충' 만들기
template<typename InputIterator, typename OutputIterator, typename Predicate>
OutputIterator copy_if(InputIterator begin, InputIterator end, OutputIterator destBegin, Predicate p)
{
// 술어 구문(Predicate)이 참이 아닌 데이터를 제외하고 모두 복사해라.. 라는 아이디어.
return remove_copy_if(begin, end, destBegin, not1(p));
}
// 하지만 컴파일 에러가 발생한다.
copy_if(widgets.begin(), widgets.end(), ostream_iterator<Widget>(cerr, "\n"), isDefective);
- 원인은 isDefective에 not1을 적용할 수 없기 때문이다.(항목 41 참조)
- not1은 함수 포인터에 바로 적용할 수 없다.
- 우선 ptr_fun에 넘기고 적용해야 한다.
copy_if를 '제대로 대충' 만들기
template<typename InputIterator, typename OutputIterator, typename Predicate>
OutputIterator copy_if(InputIterator begin, InputIterator end, OutputIterator destBegin, Predicate p)
{
while(begin != end)
{
if(p(*begin)) // 조건을 만족하면
*destBegin++ = *begin; // begin을 destBegin에 넣고, destBegin의 다음 위치로 이동
++begin; // 다음 begin 체크
}
return destBegin;
}
728x90
'개발 > Effective STL' 카테고리의 다른 글
[Effective STL] 38. 함수 객체 클래스 값 전달(pass by value) 고려하기 (0) | 2025.01.03 |
---|---|
[Effective STL] 37. 범위 요약(summarize) (0) | 2025.01.02 |
[Effective STL] 35. 대소문자 구분하지 않는 법 (0) | 2024.12.24 |
[Effective STL] 34. 정렬된 범위에 동작하는 알고리즘 (0) | 2024.12.23 |
[Effective STL] 33. 포인터 요소에 remove 알고리즘 사용 주의하기 (0) | 2024.12.20 |
Comments