c++ map 中 key 使用自定义的类,需要规避的坑点
如:
struct node {
int v[3];
};
map<node, int> mp;
当我们需要使用的map的时候,需要自定义 key 的 compare 函数, 或者是直接用默认的less<xx>
如果是后者的话,我们就需要自定义一个 key 的 operator<() 操作。
bool operator<(const node& t) const {
for (int i = 0; i < n; i++) {
if (v[i] < t.v[i]) return true;
}
return false;
}
注意:
我们要把这个方法定义为 const
我们需要定义严格小于
因为map.find() 找相等元素的逻辑是
!(lval < rval) && !(rval < lval)
我们要按照字典序来定义
在这一刻我才体会到了字典序的伟大之处
把lval 和 rval 看成是两个不同的序列
如果我们定义的小于是要求两个序列中对应的元素全部是小于号的话,当
lval{3, 1}; rval{1, 3};
这个时候根据我们之前的找相等的逻辑来看, 这个时候这两个元素会被判为相等,但实际上他们不相等
字典序 是不同序列大小判断的依据