C + + 함수 대상

3808 단어 C++
원문
표준 라 이브 러 리 의 countif 는 용기 에서 특정한 조건 을 만족 시 키 는 요소 의 개 수 를 통계 할 수 있다.예 를 들 어 정수 vector - ivec 의 정수 개 수 를 통계 하려 면 먼저 반환 형식 을 bool 로 쓸 수 있 고 int 매개 변 수 를 포함 하 는 조건 함수 가 있 습 니 다.
bool pred(int val){
    return val>0;
}

 이후 countif (ivec. begin (), ivec. end (), pred) 는 정수 의 개 수 를 계산한다.그러나 이 방법 은 뚜렷 한 결함 이 있다. 만약 에 10 이상 의 개수, 100 이상 의 개 수 를 통계 하려 면 비슷 한 함 수 를 많이 써 야 한다. 더 추상 화 할 수 있 을 까?이렇게 count 를 호출 할 수 있다 면if:count_if (ivec. begin (), ivec. end, pred (n)) 는 용기 안의 n 보다 큰 개 수 를 통계 할 수 있 으 니 얼마나 좋 을 까.함수 대상 은 이러한 메커니즘 을 제공 했다.
쉽게 말 하면 함수 대상 은 () 연산 자 를 다시 불 러 온 대상 으로 함수 처럼 사용 할 수 있 습 니 다.예 를 들 어 이 Add 클래스:
class Add{
    public:
        int operator()(int v1, int v2){
            return v1+v2;
        }
};

그것 은 덧셈 연산 을 할 수 있다.예 를 들 면:
int a1=3,a2=1;
Add add;
cout<<add(a1,a2)<<endl;

결 과 는 4 가 될 것 이다.그렇다면 이런 메커니즘 은 어떻게 아까 의 문제 에 쓰 입 니까?count 때문에if 의 세 번 째 매개 변 수 는 하나의 매개 변 수 를 받 아들 이 는 함수 이기 때문에 하나의 구조 함 수 를 통 해 이 매개 변 수 를 대상 에 전달 할 수 있 습 니 다. countif 이 함수 대상 자동 호출:
class Pred{
    private:
        int _val;
    public:
        Pred(int val):_val(val){}
        bool operator()(int val){
            return val>_val;
        }
};

따라서 100 개 이상 의 개 수 를 통계 하려 면 count 라 고 쓸 수 있다.if(ivec.begin(),ivec.end(),Pred(100))。Pred (100) 함수 대상 구성, countif 이 대상 을 용기 에 있 는 모든 요소 에 순서대로 적용 합 니 다. 실제 값 을 되 돌려 주기 만 하면 계수 기 는 1 을 추가 합 니 다.
템 플 릿 기술 을 재 활용 하면 다양한 종류의 용기 에 사용 할 수 있 습 니 다.
template<typename T>
class Pred{
    private:
        T _val;
    public:
        Pred(T val):_val(val){}
        bool operator()(T val){
            return val>_val;
        }
};

이렇게 해서 아까 의 통계 문 구 는 'count' 라 고 써 야 합 니 다.if(ivec.begin(),ivec.end(),Pred(100))。용기 가 double 형식 이 라면 괄호 안의 int 를 double 로 바 꾸 면 됩 니 다.

좋은 웹페이지 즐겨찾기