有没有一个默认的C++比较器用于用户定义结构?

问题描述 投票:0回答:2
#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一样,代码工作正常。

c++ c++11 c++14 c++17
2个回答
5
投票

你有一个 TreeNode*,不 TreeNode. A TreeNode* 只是一个指针,和所有其他非类成员指针一样,默认的比较器为 std::map, std::less,将以实现定义的方式处理它们。

如果你有一个 map<TreeNode,int> mp;,那么它将无法编译,因为没有任何的 operator < 定义为 TreeNode.


3
投票

是否有一个默认的C++比较器用于用户定义结构?

没有,而且在C++20之前也没有。

从C++20开始,可以定义这样的默认比较运算符。

struct T {
    auto operator<=>(const T&) const = default;
};

为什么我们不需要定义一个自定义的比较器来创建map mp;

地图的键是指针。指针不是用户定义的类型,它们是可以比较的。

© www.soinside.com 2019 - 2024. All rights reserved.