web-dev-qa-db-ja.com

構造体のベクトルの並べ替え

vector<data> infoここで、dataは次のように定義されます。

struct data{
    string Word;
    int number;
};

Word文字列の長さでinfoを並べ替える必要があります。素早く簡単な方法はありますか?

51
calccrypto

比較関数を使用します。

bool compareByLength(const data &a, const data &b)
{
    return a.Word.size() < b.Word.size();
}

そして std::sort ヘッダー#include <algorithm>

std::sort(info.begin(), info.end(), compareByLength);
74

比較関数/ファンクターを作成するだけです:

_bool my_cmp(const data& a, const data& b)
{
    // smallest comes first
    return a.Word.size() < b.Word.size();
}

std::sort(info.begin(), info.end(), my_cmp);
_

または、dataクラスにbool operator<(const data& a) constを指定します。

_struct data {
    string Word;
    int number;

    bool operator<(const data& a) const
    {
        return Word.size() < a.Word.size();
    }
};
_

またはフレッドが言ったように非会員:

_struct data {
    string Word;
    int number;
};

bool operator<(const data& a, const data& b)
{
    return a.Word.size() < b.Word.size();
}
_

そして、単にstd::sort()を呼び出します:

_std::sort(info.begin(), info.end());
_
33

はい:カスタム比較関数を使用してソートできます:

std::sort(info.begin(), info.end(), my_custom_comparison);

my_custom_comparisonは、2つのdataオブジェクトを受け取り、最初のオブジェクトが順序付けられているかどうかを示すboolを返すoperator()オーバーロード(ファンクター)を持つ関数またはクラスである必要があります2番目の前(つまり、first < second)。または、クラスタイプdata;のoperator<をオーバーロードできます。 operator<は、std::sortで使用されるデフォルトの順序です。

いずれにしても、比較関数は要素の 厳密な弱い順序 を生成する必要があります。

6
James McNellis

他の人が述べたように、比較関数を使用できますが、<演算子をオーバーロードすることもでき、デフォルトのless<T>ファンクターも機能します:

struct data {
    string Word;
    int number;
    bool operator < (const data& rhs) const {
        return Word.size() < rhs.Word.size();
    }
};

それはちょうどです:

std::sort(info.begin(), info.end());

編集

James McNellisが指摘したように、sortはデフォルトでless<T>ファンクターを実際には使用しません。ただし、less<T>ファンクターが機能する残りのステートメントはまだ正しいため、struct datasをstd::mapまたはstd::set thisに入れたい場合は、それでも機能しますが、比較関数を提供する他の答えは、どちらかで機能するために追加のコードを必要とします。

1
user470379