2009-07-30 1 views
1

stl :: sort의 비교 함수가 정적 멤버가 될 수없는 이유가 궁금한가요?stl이 함수를 멤버로 비교하지 않는 이유는 무엇입니까?

헤더에 선언되고 정의 된 작은 보조 도우미 클래스가 있지만 지금은 곱하기 정의되지 않도록 cmp() 구현을위한 foo.cpp 파일을 만들어야합니다.

fooCmp()가 다른 cmp()와 충돌하지 않도록 적절하게 데코 레이팅 된 이름을 생각해야합니다.

다른 변수에 대한 액세스가 필요한 비교 연산 (예 : foo.bar와의 거리 별 정렬)에는 복잡한 bind2nd 호출이 필요합니다.

+2

정적 함수 멤버가 될 수있는 비교 함수입니다.문제가 무엇이든 상관없이 코드가 표시됩니다! –

+3

VC++가 STL을 얻는 데 작은 실수를했을 때 고양이가 고양이를 밟은 것처럼 보이는 오류 메시지를 내지 않았고 결과로 나온 perl 스크립트를 통해 미국 세금 코드를 실행하면 도움이되었습니다. –

+0

VC++뿐만 아니라 모든 C++ 구현의 저주입니다. (VC10에서 'static_assert'로 조금 개선했으면 좋겠지 만). 개념은 거기에서 도움이 될 것입니다. 그러나 슬프도 그들은 물 속에서 죽었습니다 ... –

답변

3

: 여기

은 간단한 예입니다

std::sort(begin,end)  // use operator< 
std::sort(begin,end,order) // Where order is a functor 

그래서 순서가 될 수 있습니다

  • 함수
  • 정적 멤버 함수
  • 또는 함수처럼 작동하는 객체. 나를 위해

다음 작품 :

class X 
{ 
    public: static bool diff(X const& lhs,X const& rhs) { return true;} 
}; 

int main() 
{ 
    std::vector<X> a; 

    std::sort(a.begin(),a.end(),&X::diff); 
} 

그러나 클래스는 다음 몇 가지 자연 순서가있는 경우 이유를 단지 클래스의 연산자 <를 정의하지. 이렇게하면 멤버에 액세스 할 수 있으며 주문을 정의해야하는 대부분의 표준 컨테이너/알고리즘에 대해 잘 작동합니다. 함수가 클래스에 선언 된 것처럼

class X 
{ 
    public: bool operator<(X const& rhs) const { return true;} 
}; 
int main() 
{ 
    std::vector<X> a; 

    std::sort(a.begin(),a.end()); 
} 
+0

죄송합니다. 약간 잘못되었습니다 - 당신이 이것을 할 수 없다는 것을 기억하고 있다고 생각했습니다. –

+0

정렬에 전달할 수있는 인수 목록에 "free function"을 추가해야합니다. 또한 & X :: diff를 사용하면 멤버에 대한 포인터로 시각적으로 모호합니다. "& (X :: diff)"를 사용하거나 암시 적으로 "X :: diff"가 발생하도록 포인터 변환 기능을 허용하는 것이 더 좋을 것이라고 생각합니다. –

+0

@mgb : 당신이 생각할지도 모르는 예제는 당신의 술어 함수 자체가 템플릿이다. 문제는 predicate 인수가 자동으로 추론되지 않으므로 std :: sort를 호출 할 때이를 명시 적으로 지정해야한다는 것입니다. –

0

다중 정의 된 비교 함수가 염려되는 경우 static 연결을 사용하여 함수를 선언 해보십시오. 그러면 함수의 범위가 발견 된 컴파일 단위를 넘어서지 않습니다.

즉, 비교 함수는 전혀 함수 일 필요는 없지만 대신 개체 일 수 있습니다. 함수 객체는 함수와 매우 비슷하지만 일반 클래스 내에서 적절한 매개 변수를 사용하는 operator()으로 구현됩니다. 일반 클래스이므로 생성자 매개 변수를 클래스에 전달할 수 있습니다. 난 당신이 불평하는 것을 확실하지 않다

#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

class comparator { 
public: 
    bool operator()(int a, int b) { 
     return a < b; 
    } 
}; 

int main(int, char *[]) 
{ 
    vector<int> a; 
    a.push_back(1); 
    a.push_back(3); 
    a.push_back(2); 
    sort(a.begin(), a.end(), comparator()); 
    cout << a << endl; 
} 
0

실제로 인라인 연결없이 헤더에 있지만, 클래스 외부에 정의, 소리

즉, 뭔가 같은 :

class foo{ 
public: 
    static bool compare(const foo& lhs,const foo& rhs); 
    ... 
}; 
bool foo::compare(const foo& lhs,const foo& rhs){ 
    ... 
} 

대신

class foo{ 
public: 
    static bool compare(const foo& lhs,const foo& rhs); 
    ... 
}; 
inline bool foo::compare(const foo& lhs,const foo& rhs){ 
    ... 
} 

첫 번째는 함수가 모든 컴파일 단위에 정의되도록하십시오.

#includes "foo.h"