3

qsort()を使用してオブジェクトポインタの配列(PointP = Point *)を並べ替えようとしていますが、これは比較関数と並べ替えです。問題は、何も起こらず、並べ替えが行われないことです。

int compareByAngleP(const void* elem1,const void* elem2) {
    PointP point1 = (PointP) elem1;
    PointP point2 = (PointP) elem2;
    if (abs(point1->getAngle() - point2->getAngle())>0.001)
    {
        return point1->getAngle() - point2->getAngle();
    }
    return  point1->getY() - point2->getY();
}

void sortArrayP(PointP* array, int size) {
    qsort(array,size, sizeof(PointP), compareByAngleP);
}
4

4 に答える 4

4

私のアドバイスは、 を忘れてstd::qsort、単純な古いものを好むことstd::sortです。それとは異なりstd::qsort、タイプセーフであり、ほとんどの実装ではるかに高速です。

std::sort(array, array+size, compareByAngleP);

そしてvoid*、実際の型を優先して比較関数を取り除きます。

さらに、C++11 を使用していて、配列が単純にローカルの場合:

std::sort(std::begin(array), std::end(array), compareByAngleP);

std::vectorまたは、他の最も適切なコンテナを使用することをお勧めします。

std::vector<Point> array { ... };
std::sort(array.begin(), array.end(), compareByAngleP);

ノート

最初の引数が 2 番目の引数より小さい場合に true を返すように、比較関数を修正する必要がある場合があります。(または単にoperator <Point に実装します)。

参考文献

http://en.cppreference.com/w/cpp/algorithm/sort

http://en.cppreference.com/w/cpp/container/vector

于 2012-12-18T14:53:34.973 に答える
2

比較関数の使用と比較にはいくつかの問題がありますqsort

  1. qsortmemcpy配列の要素を並べ替えるために(または同様の)を使用します。Pointタイプにコピーコンストラクター(またはコピーコンストラクターを持つメンバー)がある場合、それを使用するqsortと問題が発生します(未定義動作になります)。

  2. compareByAnglePチェックする関係は推移的ではないため、関数はソートには適していません。たとえば、3つのポイントとA、がBありC、すべて同じY座標で、それぞれ角度10.00010.001、がある10.002場合、はとcompareByAngePを示しますがA == B、これは並べ替え関数に大混乱を引き起こす可能性があります。B == CA != C

于 2012-12-18T15:04:04.833 に答える
0

Compare 関数から int ではなく bool を返すと、何か違うことが起こると思います。

于 2012-12-18T15:01:48.477 に答える
0

次の qsort リファレンス (http://en.cppreference.com/w/cpp/algorithm/qsort) qsort の 3 番目のパラメーターは、「配列内の各要素のサイズ (バイト単位)」である必要があるため、代わりに

qsort(array,size, sizeof(PointP), compareByAngleP);

試す

qsort(array,size, sizeof(PointP*), compareByAngleP);

また、float を int に暗黙的にキャストしています (比較関数から値を返している間)。しかし:

(int)0.2 == 0
于 2012-12-18T14:59:17.187 に答える