클래스 :qsort에 대한 비교 함수를 작성하는 방법은 무엇입니까? 예를 들어
class classname{
public:
int N,M;
};
클래스 명 A> 클래스 명 나 경우 a.N> B.N
클래스 :qsort에 대한 비교 함수를 작성하는 방법은 무엇입니까? 예를 들어
class classname{
public:
int N,M;
};
클래스 명 A> 클래스 명 나 경우 a.N> B.N
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);
C의 qsort를 사용하고 싶습니다.) – SomeUser
왜? qsort는 오래되어 체포되었습니다. std :: sort가 새로운 섹시 함 –
''qsort'에 대해 "파기 된"것은 무엇입니까? –
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;
}
struct Functor {
bool operator()(const classname & left, const classname & right) {
return left.N < right.N;
}
}
std::sort(container.begin(), container.end(), Functor());
기술적으로'operator()'는'const'이어야한다고 생각합니다. (그리고 당신은'std :: binary_function'에서 상속받을 것입니다.) – GManNickG
: 당신이 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
그 자체로 컴파일되지 않습니다. static_cast는 캐스팅 할 값 앞에 꺾쇠 괄호 안에 유형이 있어야합니다. –
감사합니다. 코드가 실제로 올바르다. 형식이 잘못되었다. 나는 4 칸 대신에
만을 사용할 때 <> 부분이 버려진다는 것을 몰랐다. – abenthy의 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
와 더 낫다. 그것은 타입 안전하고, 아마 비교를 인라인 할 수 있기 때문에 더 빠릅니다.
이렇게하면됩니다.
#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()가 더 좋습니다.
C++에서'qsort()'가'std :: sort()'보다 우월한 방법이 있습니까? 후자는 유형 안전하고 직관적이며 일반적으로 빠릅니다. –