map自定义key的实现(invalid comparator)解决方案

在C++中使用map并自定义key(如DateTime结构体)时,需要重载<运算符以确保排序。文章指出,单纯的比较可能导致invalidcomparator错误,因为未遵循严格弱序规则。修复方法是检查重载的<运算符是否满足严格弱序,这里通过添加不等于条件来避免混乱。
摘要由CSDN通过智能技术生成

在我们用map进行插入数据时,需要对自定义key值进行<运算符重载,具体可参考

c++11 map自定义key_c++ map自定义key_小立爱学习的博客-CSDN博客

代码如下,<运算符进行重载后,貌似没有问题

#include <iostream>
#include <map>

using namespace std;

struct DateTime
{
	int year;
	int month;

	bool operator < (const DateTime& time) const
	{
		if (year < time.year)
		{
			return true;
		}
		if (month <  time.month)
		{
			return true;
		}
		return false;
	}
};
int main()
{
	map<DateTime, int> dateMap;

	DateTime a, b, c;

	a.year = 2001;
	a.month = 2;

	b.year = 2003;
	b.month = 3;

	c.year = 1990;
	c.month = 3;

	dateMap.insert(std::pair<DateTime, int>(a, 1));
	dateMap.insert(std::pair<DateTime, int>(b, 1));
	dateMap.insert(std::pair<DateTime, int>(c, 1));

	return 0;
}

但是我们一运行,确会出现invalid comparator错误,这是因为它并没有遵循C++中的严格弱序规则

当大量数据进行排序,若无严格排序规则会引起数据顺序的混乱

处理这个问题很简单,我们只需要检查重载<是否遵守严格弱序原则即可 ,将代码修改为

	bool operator < (const DateTime& time) const
	{
		if (year != time.year)
		{
			return year < time.year;
		}
		if (month != time.month)
		{
			return month < time.month;
		}
		return false;
	}

严格弱序原则可参考boost文档

Strict Weak Ordering

参考文章:

C++: “invalid comparator” 断言 - IT工具网

std::map 自定义key类型,重写operator<() 没有严格弱序引起的“invalid comparator”_Lay_Nobody的博客-CSDN博客

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值