Code Bye

stl map以结构体为key时出现的错误

struct item{
		 int xx;
		 int yy;
		 item(int x, int y) :xx(x), yy(y){}
		 bool operator<(const  item& z)const
		 {
			 if (xx <= z.xx)return true;
			 return false;
		 }
		 
	 };
	 void main(void)
	 {
		 map<item, int> mc;
		 mc.insert(pair<item, int>(item(15, 5), 0));
	//	 mc.insert(pair<item, int>(item(15, 5), 0));
		 mc.insert(pair<item, int>(item(14, 5), 0));
}

如上,对于结构体key定义了”<“的重载,在LINUX下编译运行时,重复插入(15, 5)和(15, 5)key没有问题

但是在VS下重复插入就会报运行时错误(注意key里面的比较逻辑是只比较key的首元素)

解决方案:5分
return xx < z.xx;

参见

http://bbs.csdn.net/topics/391831890

解决方案:15分

百度到了http://bbs.csdn.net/topics/390311481

问题就是vs它还反过来检查, 发现矛盾, 就报错

你operator<方法里面用了<=, 所以相同的比较结果为true, 反过来还是为true, vs绝对它被骗了, 就报错.

解决方案:10分
假如想插入重复的元素,请用multimap
解决方案:10分
排序过程中,当两个元素大小相等而被交换了顺序时,称为不稳定排序,即明显不需要交换的两个元素却被交换了,作了无用功。

两个平台的stl实现有所差异吧,win这边要求必须是稳定排序,所以会对两两元素间的大小关系双重判断,假如检查到a<b和b<a都成立,就会报错。
template<class _Pr, class _Ty1, class _Ty2> inline

bool _Debug_lt_pred(_Pr _Pred,

const _Ty1& _Left, _Ty2& _Right,

_Dbfile_t _File, _Dbline_t _Line)

{ // test if _Pred(_Left, _Right) and _Pred is strict weak ordering

if (!_Pred(_Left, _Right))

return (false);

else if (_Pred(_Right, _Left))

_DEBUG_ERROR2(“invalid operator<“, _File, _Line);

return (true);

}


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明stl map以结构体为key时出现的错误