Person p1( "Hello", "World"); Person p2( "aa", "World"); Person p3( "a", "World4"); Person p4( "a", "World2"); Person p5( "Hello", "ddd"); col.insert(p1); col.insert(p2); col.insert(p3); col.insert(p4); col.insert(p5);
> 3번째 원소가 제거된 것 뿐만 아니라 다음 3번째 (즉, 6번째)원소가 함께 제거되었다. remove_if에서 원소를 찾은 후 남은 원소를 처리하기 위해 조건자의 복사본을 사용한다고 한다. 근데 Nth를 2로 해 보면, 2,4가 제거되어 있다. 원소를 한번 찾아서 제거한 후, 다음 번 원소는 딱 한번만 더 실행되는 이유는?
8.2 미리정의된 함수-객체
*STL에 미리 정의된 함수객체
함수객체명
설명
negate<type>()
- param
plus<type>()
param1 + param2
minus<type>()
param1 - param2
multiplies<type>()
param1 * param2
divides<type>()
param1 / param2
modulus<type>()
param1 % param2
equal_to<type>()
param1 == param2
not_equal_to<type>()
param1 != param2
less<type>()
param1 < param2. 정렬의 기본기준
greater<type>()
param1 > param2
less_equal<type>()
param1 <= param2
greater_equal<type>()
param1 >= param2
logical_not<type>()
!param
logical_and<type>()
param1 && param2
logical_or<type>()
param1 || param2
8.2.1 함수 어댑터
-함수어댑터 : 함수-객체를 특정값 또는 특정 함수와 결합시킨 함수 객체
-미리 정의된 함수 어댑터
표현식
효과
bind1st(op, value)
op(value, param)
bind2nd(op, value)
op(param, value)
not1(op)
!op(param)
not2(op)
!op(param1, param2)
-기능적 조합법 : 함수 어댑터는 스스로 함수-객체가 됨. 함수 어댑터를 사용하여 다른 함수객체들을 결합할 수 있음
8.2.2 멤버 함수를 위한 함수 어댑터
-C++ 표준 라이브러리에는 컬렉션의 각각의 원소에 대해 멤버함수를 호출하는 어댑터제공
-멤버 함수에 대한 함수 어댑터
표현식
효과
mem_fun_ref(op)
객체에 대해서 멤버함수 op()를 호출
mem_fun(op)
객체의 포인터에 대해 멤버함수 op()를 호출
-mem_fun_ref의 목적 : 각 객체에 대해 멤버함수 호출이 불가하여 해당 어댑터를 사용하여 알고리즘에 멤
버함수를 전달해주기 위함
8.2.3 기존의 함수를 위한 함수 어댑터
- 기존 함수를 함수객체와 사용할 수 있도록 해주기 위함
- 표현식
표현식
효과
ptr_fun(op)
*op(param)
*op(param1, param2)
8.2.4 함수어댑터를 위한 사용자 정의 함수-객체
- 사용자가 정의한 함수 객체를 어댑터와 같이 사용하려면 몇가지 조건을 만족시켜야 함.
작성한함수 객체들은 함수객체의 인자와 결과를 위해 타입 멤버를 제공하여야 함. 이를 위해C++표준 라
이브러리에서는 unary_function, binary_function 구조체를 제공한다. 사용자는 위 구조체를 상속받아 함
수객체를 만들어 쉽게 어댑터와 함께 동작할 수 있도록 만들 수 있다.
*구조체 형태
unary function
binary function
template<class Arg, class Result>
struct unary_function{
typedef Arg argument_type;
typedef Result result_type;
};
template<class Arg1, class Arg2, class Result>
struct binary_function{
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
}
함수객체정의예제
예제)
//fopow.hpp
#include <functional> #include <cmath>
template <class T1, class T2> struct fopow : public std::binary_function<T1, T2, T1> { T1 operator() (T1 base, T2 exp) const { return std::pow(base, exp); //VC6에서는 std::pow가 아닌 pow임 } }
댓글