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==,但是当且仅当 !(a < b) && !(b < a) 时,两个键 a 和 b 被认为是等效的。

于 2012-04-07T01:25:22.590 回答