1. ホーム
  2. c++

[解決済み] std::mapのキークラスが有効なキーであるために満たすべき要件は何ですか?

2023-07-16 15:16:03

質問

あるクラスのオブジェクトを別のクラスのオブジェクトにマッピングしたい。しかし、私がキーとして使いたいクラスは、私が書いたものではなく、単純な struct std::map はその内容を順序付けます。私はそれがどのように行われるのか、そして任意のクラスがキーとして使用できるのか、または定義される必要がある一連の要件(演算子やその他)があるのかどうか疑問に思っていました。

もしそうなら、map が使用する演算子を実装したクラスのラッパーを作成することができます。私は最初に何を実装する必要があるのかを知る必要があり、私が使用しているクラスのリファレンスはどれも オンラインで見つけた はそれらを指定しません。

どのように解決するのですか?

キーに求められるのは、コピーと割り当てが可能であることです。 マップ内の順序は、テンプレートへの3番目の引数で定義されます。 テンプレート(および使用されている場合はコンストラクタの引数)の第3引数によって定義されます。 これは のデフォルトは になります。 std::less<KeyType> というように、デフォルトで < 演算子になります。 が、デフォルトを使う必要はありません。 ただ、比較演算子を書けばいいのです。 演算子を書けばよいのです(できれば関数型オブジェクトとして)。

struct CmpMyType
{
    bool operator()( MyType const& lhs, MyType const& rhs ) const
    {
        //  ...
    }
};

厳密な順序を定義しなければならないことに注意してください。 CmpMyType()( a, b ) が真を返したら CmpMyType()( b, a ) はfalseを返さなければなりません。 がともにfalseを返した場合、その要素は等しい(同じ等価クラスのメンバー)とみなされます。 同じ等価クラスのメンバー)とみなされます。