2016-05-27 11 views
-2

私はクラスtranzitiemap<int, map<tranzitie, int>>を持っています。地図が正常に動作するためには、の<演算子をどのようにオーバーロードする必要がありますか? 2つの文字と1つの文字列が含まれています。私は試しましたが、(私の見解ではなくても)価値が等しいと考えて、うまくいくと思います。このクラスのマップで '<'をどのようにオーバーロードする必要がありますか?

class tranzitie{ 
public: 
    char litera; 
    char top; 
    string newst; 

    bool operator==(const tranzitie& x); 
    tranzitie& operator=(const tranzitie& x); 
    tranzitie (const tranzitie& x); 
    tranzitie(){}; 
    inline bool operator< (const tranzitie& rhs) const; 
}; 
+2

何あなたは何を手に入れた、試してみましたが、どのような(**なぜ**)あなたは期待したのですか? – Lol4t0

+2

ヒント: 'std :: tie'を使うべきです – NathanOliver

+1

どうやって注文しますか? – vu1p3n0x

答えて

0

あなたはすべてのデータメンバーを比較する必要があります。

bool operator< (const tranzitie& rhs) const { 
    if(litera == rhs.litera) { 
     if(top == rhs.top) { 
      return newst < rhs.newst; 
     } 
     return top < rhs.top; 
    } 
    return litera < rhs.litera; 
} 
+0

'if(litera!= rhs.litera)return litera

+0

@MooingDuck私の目標は、いくつかのメンバーを持つクラスのless演算子を書く方法を示すことでした。その場合のネストは、私にとっては読みやすくなります。 – AnatolyS

+0

本当ですか?つまり、読みやすさは主観的ですが、私の行数は少なく、各メンバーの比較を一緒に保ち、入れ子を避け、同じパフォーマンスを持っています。 –

1

はフリー機能の代わりに、メンバ関数としてoperator<を実装好みます。 operator<関数内のプライベートメンバーにアクセスする必要がある場合は、operator<の機能をフレンドにする必要があります。あなたの場合、tranzitieのメンバーは一般公開されているので、必要ありません。

暗記するための最も簡単なパターンは、おそらくこれです:

bool operator<(const tranzitie& lhs, const tranzitie& rhs) { 
    if (lhs.litera < rhs.litera) return true; 
    if (rhs.litera < lhs.litera) return false; 
    if (lhs.top < rhs.top) return true; 
    if (rhs.top < lhs.top) return false; 
    return lhs.newst < rhs.newst; 
} 

暗記するのに最適なパターンが、これはおそらくです:

bool operator<(const tranzitie& lhs, const tranzitie& rhs) { 
    return 
    std::tie(lhs.litera, lhs.top, lhs.newst) < 
    std::tie(rhs.litera, rhs.top, rhs.newst); 
}