Как написать функцию сравнения для qsort? - PullRequest
2 голосов
/ 18 января 2010

класс например:

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

имя класса a> имя класса b, если a.N> B.N

Ответы [ 6 ]

5 голосов
/ 18 января 2010
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's 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);
4 голосов
/ 18 января 2010
struct Functor {
   bool operator()(const classname & left, const classname & right) {
       return left.N < right.N;
   }
}

std::sort(container.begin(), container.end(), Functor());
4 голосов
/ 18 января 2010

Поскольку вы используете C ++, я бы посоветовал использовать std :: sort вместо qsort.В этом случае вы обычно реализуете свою функцию сравнения как operator<:

class classname { 
public:
    int N, M;

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

Редактировать: если вы настаиваете на использовании qsort C, функция сравнения выглядит примерно так:

int comparator(void *a, void *b) { 
     return ((classname *)b)->N - ((classname *)a)->N;
}
2 голосов
/ 18 января 2010

Если вы специально хотите использовать qsort, тогда эта функция будет

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 голос
/ 18 января 2010

Это должно работать.

#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 (), вероятно, лучше.

1 голос
/ 18 января 2010

В случае, если вы действительно хотите получить C's qsort (чего не следует делать, если вы используете C ++):

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

Затем просто передайте сравнение в качестве 4-го аргумента qsort

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...