現在、入力ファイルから情報を読み取っています。その情報の中に、名前があります。すべての情報が構造体に読み込まれます。これらの構造体の配列があります。
二分探索木を使用して、構造体を姓でアルファベット順に並べる必要があります。
==、<、>の演算子オーバーロード関数を作成する必要がありますか?もしそうなら、誰かが私がそれを始めるのを手伝ってくれる?
現在、入力ファイルから情報を読み取っています。その情報の中に、名前があります。すべての情報が構造体に読み込まれます。これらの構造体の配列があります。
二分探索木を使用して、構造体を姓でアルファベット順に並べる必要があります。
==、<、>の演算子オーバーロード関数を作成する必要がありますか?もしそうなら、誰かが私がそれを始めるのを手伝ってくれる?
はい、==と<の演算子のオーバーロードを記述したいと思うでしょう。(>は必要ありません。else
例を確認してから大文字と小文字を区別してくださいif (a < b)
; else if (a == b)
。)
私たちの場合、名前でアルファベット順に並べているので、一方の構造体がもう一方の構造体よりも「小さい」のは、その名前がもう一方の名前のアルファベットより前にある場合に限ります。
では、問題は正確には何ですか?演算子のオーバーロードを書く方法を知っていますか?文字列を比較して、アルファベット順で最初に来る文字列を判別する方法を知っていますか?
構造体の任意の2つのインスタンスを比較する方法が必要です。たとえば、比較演算子を書くことは、operator<()
それを実行するための便利な方法かもしれません。
class Record {
friend bool operator<(const Record&, const Record&);
std::string name;
// ...
};
bool operator<(const Record& a, const Record& b)
{
// return true if the name of a is less than the name of b
}
ノードは左側のサブツリーまたは右側のサブツリーのいずれかに挿入されるため、ノードが別のノードより「小さい」かどうかを知る必要があるだけです。そうでない場合は、他のノード以上であるかどうかは関係ありません。どちらの方法でも他のサブツリーに移動します。
もちろん、他のタスクでは等式の比較が必要になる場合があります。その場合は、最後まで行き、不等式演算子も提供することをお勧めします。
rel_ops
名前空間も興味深いものです。
通常は<をオーバーロードする必要がありますが、構造体にソートしたい要素が他にある場合は、それを実行しても意味がありません。構造体の2つのパラメーターを受け入れ、それらを姓で比較する別の関数を作成する必要があります。最初のパラメーターが2番目のパラメーターの前にある場合はtrueを返し、そうでない場合はfalseを返します。次に、その関数をstd::sortに渡します。このようなもの:
bool compare_by_last_name(const MyStruct & lhs, const MyStruct & rhs)
{
return lhs.last_name < rhs.last_name;
}
// later
vector<MyStruct> v;
// put some elements in v
std::sort(v.begin(), v.end(), compare_by_last_name);
「二分探索木を使用する」という文を無視したことに気付くでしょう。あなたが何を意味するのかよくわからないからですが、おそらく無関係です。独自のコンテナクラスなどを作成しましたか?
演算子のオーバーロードは、関数やメソッドと同じように機能します。それらは、まったく同じ方法で戻り型と引数を取得します。たとえば、二項演算子(のような<
)は、1つの引数を持つメンバー関数、または演算子の各側にそれぞれ1つずつ、2つの引数を持つ自由関数になります。唯一の違いは、識別子関数名を使用する代わりに、特別な構文を使用することです。キーワードのoperator
後に演算子がオーバーロードされます。したがって、同等のタイプが必要な場合は、次のようにすることができます。
class MyUserType
{
private:
std::string sort_significant;
std::string sort_insignificant;
public:
bool operator<(const MyUserType &) const;
};
bool MyUserType::operator<(const MyUserType & other) const
{
return sort_significant < other.sort_significant;
}