2

ここで他の人のコードを理解しようとするのに苦労しています。誰かが私を助けてくれたら本当にありがたいです。

オブジェクトの配列があるとしましょう:vpair_listそしてこれvpair_listはクラスのタイプを持っていvpairます。したがって、次のようになります。

class vpair
{
public:
    int vid;
    int vlabel;
};

bool operator < (const vpair& x, const vpair& y);

vpair* vpair_list;
vpair_list = new vpair[25];
..
sort(vpair_list, vpair_list+j);

それから私が知っているのはsort()、配列の各要素を比較して並べvpair_list替えることです。

vpairオブジェクトには2つの異なるプロパティがあるため、ソートがどのように機能するのか理解できません。

並べ替えは、各プロパティ(vidおよびvlabel)または....を比較するように機能しますか?私が思ったのは、特定のフィールドまたはプロパティ(いずれかvidまたはvlabelここ)を比較することによってソートが行われることになっているということでした。

しかし、このコードはそれとは何の関係もなく、オブジェクト全体を比較しているように見えます。誰かがそれがどのように機能するか教えてもらえますか?

前もって感謝します。

4

3 に答える 3

2

標準的なアプローチ:

class vpair
{
public:
    int vid;
    int vlabel;
};

bool operator < (vpair const& x, vpair const& y)
{
     return std::tie(x.vid, x.vlabel) < std::tie(y.vid, y.vlabel);
}

もちろん、オペレーターはメンバーになることができます。

class vpair
{
    int vid;
    int vlabel;
public:
    bool operator < (vpair const& y) const
    {
         return std::tie(vid, vlabel) < std::tie(y.vid, y.vlabel);
    }

};
于 2013-01-04T00:58:17.797 に答える
1

デフォルトでは、並べ替えは と比較されますoperator<。次のように、クラスにこの演算子を実装できます。

public:
bool operator < (const vpair& other) const
{
     return (vid < other.vid); // Uses vid but this can be vlable or something else.
}

使用しているクラスでのオーバーロードがない場合は、いつでもの 3 番目の引数operator<として比較関数を渡すことができます。std::sort

bool compare_func(vpair i,vpair j) { return (i.vid < j.vid); }
sort(vpair_list, vpair_list+j, compare_func);
于 2013-01-04T00:59:05.483 に答える