在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容器的大小比较规则,也是一种可行的方案。