在c++map容器中自定义比较规则报错

在c++map容器中自定义比较规则报错

c++的map是一个有序容器,map中的元素都是pair模板类的对象。关键字(first成员变量)各不相同。map中的元素按照关键字从小到大排列,缺省情况下用less,即“<”(小于号)来定义比较规则。
但是有时候我们想要用到的关键字不能用“<”来比较大小,比如关键字是结构体或类,那就需要重载“<”。
在最近的一个项目中,我就遇到了重载“<”报错的问题。

定义map的代码如下

// Target类型是一个自定义的对象
map<Target, vector<Drone> > targetToDronePzt;

报的错如下
在这里插入图片描述
是因为编译器找不到可用的“<”来比较Target类之间的大小,为了解决这个问题,首先想到的是要重载“<”。
重载“<”有两种方式
1、将操作符重载实现为类的成员函数;
2、操作符重载实现为非类的成员函数(即全局函数);

我这两种方式都试过了,但是还是报同样的错误。找了很久也不知道是哪里出了问题,然后我就放弃了重载“<”。

除了重载运算符还有一种方式可以定义比较规则,那就是写一个用于比较大小的函数对象,函数对象是重载了“()”运算符的类的对象。
方法如下:

// 定义函数对象,根据自己的需求修改返回值
class myLess {
public:
    bool operator()(const Target &t1, const Target& t2)const {
        return t1.targetNum < t2.targetNum;
    }
};

然后定义map的时候指定用myLess作为比较规则,

// 使用自定义的比较规则
map<Target, vector<Drone>, myLess > targetToDronePzt;

通过函数对象实现map容器的大小比较规则,也是一种可行的方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值