2

ここに私の問題があります:私は構造体を持っています:

struct point
{
    int x;
    int y;
};

そして、私は配列を持っています:

for (int i = 0;i < n;i++)
{
    arr[i].x=rand() % n + 1;
}

quicksort関数を次のように定義しました。

 void quicksort(int *a, int left, int right);

Xポイントを座標で並べ替えたいので、次のように呼び出しquicksortます。

quicksort(arr.x, 0, n-1);

そして、これはエラーメッセージです:

エラー: 非クラス型 'point [(((unsigned int)(((int)n) + -0x000000001)) + 1)]' である 'arr' のメンバー 'x' の要求

質問があまりにもばかげていたり、定式化が不十分だったりして申し訳ありません。真実は、私は初心者であり、可能な限り多くのことを学びたいと思っています。あなたの助けにとても感謝しています!

4

7 に答える 7

3

常に で並べ替えたい場合はx、それを sort 関数にハードコードし、配列へのポインターを渡して並べ替えることができます。

void quicksort(point * arr, int left, int right) {
    // test points with 
    // if (arr[i].x < arr[j].x) {/* i sorts before j */}
}

quicksort(arr, 0, n-1);

並べ替えの基準となるクラス メンバーを指定するには、ポインターではなく、メンバーへのポインターが必要です。何かのようなもの:

void quicksort(point * arr, int point::*member, int left, int right){
    // test points with 
    // if (arr[i].*member < arr[j].*member) {/* i sorts before j */}
}

quicksort(arr, &point::x, 0, n-1);

より一般的には、次の例に従い、std::sort任意の比較ファンクターを受け入れることができます。

template <typename RandIter, typename Compare>
void quicksort(RandIter begin, RandIter end, Compare compare) {
    // test points with 
    // if (compare(*it1, *it2)) {/* *it1 sorts before *it2 */}
}

quicksort(arr, arr+n, 
    [](point const &lhs, point const &rhs) {return lhs.x < rhs.x;});

そしてもちろん、ソート アルゴリズムの実装方法を学んでいない限り、単に を使用してstd::sortください。

于 2013-09-23T15:42:34.233 に答える
0

(ほとんど) オブジェクトへのポインターを本当に渡したいときに、メンバーへのポインターを渡してシステムをだまそうとしないでください。Grijeshが提案したように実行してください。メンバーを渡すと、恐ろしい副作用が発生する可能性があります。たとえば、クイックソートは、どれが X でどれが Y であるかに関係なく、すべての整数を一緒に並べ替えます。軽度のケースでは、比較基準が間違っている可能性があり、ポインターの最適化が正しくないなどの影響をデバッグするのが難しい場合がよくあります。オブジェクトポインターを渡す必要がある場合は、コンパイラーに正直にオブジェクトポインターを渡してください。ほとんどの例外は、関数呼び出しの「反対側」がオブジェクトを処理できない低レベルのシステムプログラミングに関係しています。

于 2013-09-23T15:48:19.130 に答える
0

コードにはいくつかの問題があります。
1. クイックソートは int* を受け入れますが、int 値 x を渡そうとします
2. int を渡そうとしますが、実際には未定義の変数 arr.x を呼び出します

&arr[i].x の形式で呼び出す必要がありますが、目的を達成するには、おそらく構造体全体をポインターとして渡す必要があります。

于 2013-09-23T15:40:44.970 に答える
0

arrこれはソートされる配列であるため、パラメーターとして渡す必要があります。arr.x無意味です。文字列をパラメーターとして渡しているわけではありません。"arr.x"これは、何らかの方法で x フィールドの並べ替えを意味すると解釈できます。コンパイラーがこれを確認すると、存在しないのx要素を探しています。arrの要素arr(例: arr[0]) にはx要素 ( としてアクセス) がありarr[0].xます。

于 2013-09-23T15:41:16.787 に答える