#include<bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
int main() {
map<TreeNode*,int> mp;
TreeNode* x=new TreeNode(4);
TreeNode* y=new TreeNode(5);
TreeNode* z=new TreeNode(6);
mp[x]=1;
mp[y]=2;
mp[z]=3;
cout<<mp[x]<<endl;
return 0;
}
上面的代码编译后给出了想要的结果,但是为什么我们不需要定义一个自定义的比较器来创建map mp;难道C++自己就能做到吗?和unordered_map一样,代码工作正常。
你有一个 TreeNode*
,不 TreeNode
. A TreeNode*
只是一个指针,和所有其他非类成员指针一样,默认的比较器为 std::map
, std::less
,将以实现定义的方式处理它们。
如果你有一个 map<TreeNode,int> mp;
,那么它将无法编译,因为没有任何的 operator <
定义为 TreeNode
.
是否有一个默认的C++比较器用于用户定义结构?
没有,而且在C++20之前也没有。
从C++20开始,可以定义这样的默认比较运算符。
struct T {
auto operator<=>(const T&) const = default;
};
为什么我们不需要定义一个自定义的比较器来创建map mp;
地图的键是指针。指针不是用户定义的类型,它们是可以比较的。