stl::map 重载 operator“<”注意事项

一、首先明确map定义

map是STL的一个关联容器,它提供一对一的hash。

  • 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
  • 第二个可能称为该关键字的值(value);

二、注意事项

如果定义的map的关键字(key)是标准库中的类型如(int)(double)(string)等等,则无需重载“<”;

如果定义的map的关键字(key)是自己定义的 结构/类 对象,则注意要重载“<”。

struct indices{ unsigned int v, vt; }
map<indices,int> indicesMap;

如下图:


struct indices
{
	unsigned int v, vt;
	bool operator<(const struct indices & right)const   //重载<运算符
	{
			if (this->vt < right.vt)
				return true;
			else if (this->vt == right.vt)
			{
				if (this->v < right.v)
					return true;	
			}
			return false;
	}
};

1.为什么?

因为map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的。比如一个班级中,每个学生的学号跟他的姓名就存在著一对一映射的关系。所以如果不对自定义对象重载“<”函数,会导致map无法完成自动排序,程序会报错:

2.怎么办?

逻辑很简单,只需要定义一个逻辑严密的" operator<"函数即可。

逻辑严密是指在自定义对象的任何情况下,都有唯一的大小比较结果。而且不会出现

a<b,b<c ,而c<a的情况。

代码如下:


struct indices
{
	unsigned int v, vt;
	bool operator<(const struct indices & right)const   //重载<运算符
	{
			if (this->vt < right.vt)
				return true;
			else if (this->vt == right.vt)
			{
				if (this->v < right.v)
					return true;	
			}
			return false;
	}
};

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值