2014-03-07 6 views
0

첫째로, 나는 더 큰 정수에 더 높은 우선 순위를 줄 것이라고 priority_queue<int> 발견. priority_queue<int, vector<int>, greater>을 사용하는 경우 역으로 수행합니다. 왜?함수 포인터가 아니라면 무엇입니까?

또한 우선 순위 큐에 넣은 비교기는 함수 포인터가 아닙니다. 대신 다음과 같이 정의되었습니다 :

struct cmp{ 
    bool operator() (const int& lhs, const int&rhs) const 
    { 
     ... 
    } 
} 

나는 이것이 C++의 매우 유용한 속성이라고 들었습니다. 누구든지이 유형의 코드를 나에게 설명 할 수 있습니까?

+0

[C++ 펑 -하고 그 사용]의 중복 가능성 (http://stackoverflow.com/questions/356950/c-functors-and-their-uses) – Shoe

답변

2

이것은 펑터입니다. 이것은 기본적으로 operator()을 오버로드하여 함수처럼 작동하는 클래스/객체입니다. 예를 들어 코드에서 다음을 할 수 있습니다.

cmp func; 
func(1, 2); 
//^calls operator() 

here에 대한 자세한 내용을 볼 수 있습니다.

0

이런 종류의 코드의 이점은 형식이 템플릿 인 경우 함수 포인터 또는 위와 같은 클래스 (펑터)를 넣을 수 있다는 것입니다. 두 경우 모두 둘 다 작동하며, 첫 번째는 더 간단하고 두 번째는 주어진 데이터를 가질 수 있습니다. Lambdas는 C++ 11에서 조금 덜 복잡해졌습니다.

0

알고리즘을 통해 상태을 유지하기 위해 펑터가 자주 사용됩니다. 다음 검색 기능을 고려

struct Foo { int x }; 
std::vector<Foo> fooList; // Imagine this is populated. 

struct FindFunc 
{ 
    FindFunc(int toFind) : val(toFind) {} 
    bool operator()(const Foo& el) { return el.x == val; } 
    int val; 
}; 

// Seach the list of Foo objects for one where member x is 42 
std::find_if(fooList.begin(), fooList.end(), FindFunc(42)); 
관련 문제