vector<data> info
ここで、data
は次のように定義されます。
struct data{
string Word;
int number;
};
Word文字列の長さでinfo
を並べ替える必要があります。素早く簡単な方法はありますか?
比較関数を使用します。
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);
比較関数/ファンクターを作成するだけです:
_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());
_
はい:カスタム比較関数を使用してソートできます:
std::sort(info.begin(), info.end(), my_custom_comparison);
my_custom_comparison
は、2つのdata
オブジェクトを受け取り、最初のオブジェクトが順序付けられているかどうかを示すbool
を返すoperator()
オーバーロード(ファンクター)を持つ関数またはクラスである必要があります2番目の前(つまり、first < second
)。または、クラスタイプdata
;のoperator<
をオーバーロードできます。 operator<
は、std::sort
で使用されるデフォルトの順序です。
いずれにしても、比較関数は要素の 厳密な弱い順序 を生成する必要があります。
他の人が述べたように、比較関数を使用できますが、<演算子をオーバーロードすることもでき、デフォルトの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 data
sをstd::map
またはstd::set
thisに入れたい場合は、それでも機能しますが、比較関数を提供する他の答えは、どちらかで機能するために追加のコードを必要とします。