すべての比較演算子をオーバーロードするクラスがあります。私はこれらのオブジェクトの束をキーとしてマップにロードし、マップがそれらを最小から最大にソートすることを期待しています。
ただし、マップは実際には最大から最小の順に並べ替えられます。どうしてこれなの?マップを並べ替えるときに、キーの比較演算子を使用しませんか?どうすればこれを行うことができますか?
std :: mapの定義を見ると、3番目のパラメーターはコンパレーターです-std::less< Key >
デフォルトでは。デフォルトの実装は、を呼び出すだけoperator<
です。
YourType
次のように、が定義されているヘッダーで新しいバージョンを定義してみてください。
template<> std::less< YourType >
{
bool operator()(
const YourType& lhs,
const YourType& rhs)
{
if(!(lhs.member1 < rhs.member1))
{
return false;
}
if(!(lhs.member2 < rhs.member2))
{
return false;
}
return true;
}
}
std::less< YourType >
クラスで友達になることを忘れないでください。
実際のテストは以下に準拠している必要があります。準拠していないと、あらゆる種類の問題が発生します。
注意すべき重要なことの1つ(私が最近発見したこと)は、コンパイラーが、または他のファンキーなものの意味を再定義したと文句を言い始めた場合、を宣言したときにstd::less
のみ前方宣言した可能性があるということです。YourType
std::map< YourType >
お役に立てれば!
比較演算子のオーバーロードを実装するコードを投稿する必要があるため、推測に基づいて答えることができます。
あなたの問題は単純なタイプミスかもしれません(私は一度それをしました)
bool operator < ( T lhs, T rhs ) const
{
return rhs < lhs; // note: lhs is on the right!
}
しかし実際にはあなたが望む:
bool operator < ( T lhs, T rhs ) const
{
return lhs < rhs;
}