3

次のコードでエラーが発生しました

struct MapKey {
    std::string x;
    std::string y;
}

std::map<MapKey, int> m;

if (m.find(key) != m.end()) {
    ......
}

エラーが表示されます。

no match for "operator<" in '__x < __y'

問題は、MapKey に比較メソッドが必要なことだと思います。Mapkey 用にどのように実装できるか疑問に思っています。例えば、

struct MapKey {
    bool operator<(const MapKey &key) const {
        ... what shall I put here? ...
    }
    std::string x;
    std::string y;
}

ありがとう。

4

2 に答える 2

9

これをMapKeyの定義の後に (メンバ関数ではなく自由関数として) 定義すると、次のように設定されます。

bool operator <(MapKey const& lhs, MapKey const& rhs)
{
    return lhs.x < rhs.x || lhs.x == rhs.x && lhs.y < rhs.y;
}

inline定義がヘッダー ファイルにあるかのようにオペレーターを定義してください。そうしないと、リンカー エラーが発生する危険があります。

于 2012-04-07T00:59:59.500 に答える
2

厳密な弱い順序付けを誘導する任意の関数 (const 引数を取ることができる) は問題ありません。また、operator== は必要ありませんが、2 つのキー a と b は、!(a < b) && !(b < a) の場合にのみ同等と見なされます。

于 2012-04-07T01:25:22.590 に答える