2010-01-18 4 views

답변

5
class classname{ 
    public: 
    int N,M; 

    bool operator< (const classname& other) const { return N < other.N; } 
}; 

... 
std::vector<classname> arr; 
... 
std::sort(arr.begin(), arr.end()); 

아니면 C의 qsort를 사용 하시겠습니까?

static int compare_classname (const void* a, const void* b) { 
    const classname* _a = reinterpret_cast<const classname*>(a); 
    const classname* _b = reinterpret_cast<const classname*>(b); 
    return _a->N < _b->N ? -1 : _a->N > _b->N ? 1 : 0; 
} 
... 
classname* arr = new classname[n]; 
... 
qsort(arr, n, sizeof(arr[0]), compare_classname); 
+0

C의 qsort를 사용하고 싶습니다.) – SomeUser

+5

왜? qsort는 오래되어 체포되었습니다. std :: sort가 새로운 섹시 함 –

+2

''qsort'에 대해 "파기 된"것은 무엇입니까? –

4

C++을 사용하고 있으므로 qsort 대신 std :: sort를 사용하는 것이 좋습니다. 이 경우 일반적으로 operator<로 비교 기능을 구현 :

class classname { 
public: 
    int N, M; 

    bool operator<(classname const &other) const { 
     return N < other.N; 
    } 
}; 

편집 :에서

int comparator(void *a, void *b) { 
    return ((classname *)b)->N - ((classname *)a)->N; 
} 
4
struct Functor { 
    bool operator()(const classname & left, const classname & right) { 
     return left.N < right.N; 
    } 
} 

std::sort(container.begin(), container.end(), Functor()); 
+0

기술적으로'operator()'는'const'이어야한다고 생각합니다. (그리고 당신은'std :: binary_function'에서 상속받을 것입니다.) – GManNickG

1

: 당신이 C의 qsort가 사용에 대한 고집 는 비교 함수는 다음과 같이 보입니다 C++을 사용하는 경우에는 C의 qsort을 사용하면 안됩니다 :

int compare(const void * a, const void * b) 
{ 
    return static_cast<classname*>(a)->N < static_cast<classname*>(b)->N; 
} 

그럼 그냥 특별히 qsort를 사용하려면 qsort

+1

그 자체로 컴파일되지 않습니다. static_cast는 캐스팅 할 값 앞에 꺾쇠 괄호 안에 유형이 있어야합니다. –

+0

감사합니다. 코드가 실제로 올바르다. 형식이 잘못되었다. 나는 4 칸 대신에

만을 사용할 때 <> 부분이 버려진다는 것을 몰랐다. –
                        
                            
    abenthy
                                
                            
                        
                    

2

의 4 번째 인자로 비교 통과, 다음 함수는

int compare_classname(const void *a, const void *b) 
{ 
    return static_cast<const classname*>(a)->N 
     - static_cast<const classname*>(b)->N; 
} 

될 것이다 그러나 다른 사람이 말했듯이, 당신은 std::sort와 더 낫다. 그것은 타입 안전하고, 아마 비교를 인라인 할 수 있기 때문에 더 빠릅니다.

1

이렇게하면됩니다.

#include <stdlib.h> 


class classname{ 
public: 
    int N,M; 
}; 

static int 
cmp_classname(const void * p1, const void * p2) 
{ 
    const classname * pc1 = reinterpret_cast<const classname *>(p1); 
    const classname * pc2 = reinterpret_cast<const classname *>(p2); 
    if (pc1->N < pc2->N) { 
     return -1; 
    } else if (pc1->N > pc2->N) { 
     return 1; 
    } 
    return 0; 
} 

그렇다면 std :: sort()가 더 좋습니다.