2010-12-02 31 views
0

現在、入力ファイルから情報を読み取り中です。その情報の中には名前があります。すべての情報は構造体に読み込まれます。これらの構造体の配列があります。C++ - アルファベット文字列

バイナリ検索ツリーを使用して、姓で構造体をアルファベット順に並べる必要があります。

==、<、および>の演算子オーバーロード関数を記述する必要があります。もしそうなら誰かが私を助けてくれるのですか?

+2

::::::宿題? – wilhelmtell

+0

最初にバイナリツリーを作成する必要がありますか? – wilhelmtell

+0

私はすでにバイナリツリークラスを書いています...私はちょうどオペレータのオーバーロードについて混乱しています – Johnrad

答えて

0

オペレータのオーバーロードは、関数またはメソッドと同じように機能します。彼らは戻り値の型と引数を同じように取得します。たとえば、バイナリ演算子(<など)は、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; 
} 
+0

あなたは 'const MyUserType&'を意味します。 – wilhelmtell

+0

私はそれを意味します、fix'd – SingleNegationElimination

1

はい、==と<の演算子オーバーロードを記述したいと思うでしょう。 (>は必要ありませんが、ちょうど例えばif (a < b)をチェックした後elseケースを使用し;。else if (a == b)

我々の場合には、我々は最後の名前によってアルファベット順に並べているため、一つの構造体は、他の場合に限り、その最後の名前「未満」でありますもう一方の姓はアルファベット順に表示されます。

だから問題は何ですか?演算子のオーバーロードを書く方法を知っていますか?文字列を比較し、アルファベット順に最初に来るものを判断する方法を知っていますか?

+0

私はちょうどオペレータのオーバーロードを書くのを助ける必要があります。もしあなたがそれを手伝ってくれれば、それは最高だろう。 – Johnrad

1

構造体の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名前空間も重要です。

0

通常は<をオーバーロードする必要がありますが、構造体に他の要素があると並べ替えたい場合がありますが、それは実際には意味がありません。構造体の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); 

あなたは私はかなりあなたが何を意味するのか分からないが、それはおそらく無関係ですので、私は、「二分探索木を使用した」あなたの文を無視しているに気づくでしょう。あなた自身のコンテナクラスか何かを作ったのですか?

関連する問題