2

すべての比較演算子をオーバーロードするクラスがあります。私はこれらのオブジェクトの束をキーとしてマップにロードし、マップがそれらを最小から最大にソートすることを期待しています。

ただし、マップは実際には最大から最小の順に並べ替えられます。どうしてこれなの?マップを並べ替えるときに、キーの比較演算子を使用しませんか?どうすればこれを行うことができますか?

4

2 に答える 2

2

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 >クラスで友達になることを忘れないでください。

実際のテストは以下に準拠している必要があります。準拠していないと、あらゆる種類の問題が発生します。

  • lhs <rhs = true
  • rha <lhs = false
  • lhs <lhs = false

注意すべき重要なことの1つ(私が最近発見したこと)は、コンパイラーが、または他のファンキーなものの意味を再定義したと文句を言い始めた場合、を宣言したときにstd::lessのみ前方宣言した可能性があるということです。YourTypestd::map< YourType >

お役に立てれば!

于 2012-05-24T08:58:58.930 に答える
0

比較演算子のオーバーロードを実装するコードを投稿する必要があるため、推測に基づいて答えることができます。

あなたの問題は単純なタイプミスかもしれません(私は一度それをしました)

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; 
}
于 2012-05-24T08:18:05.797 に答える