`
wander754085
  • 浏览: 51691 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

STL中容器使用自定义排序时出现assert

阅读更多

         使用STL容器时(此次我遇到的问题是使用STL的优先级队列priority_queue时出现的),如果要放入的内容非基本类型(自定义对象或结构体)时,一般需要使用自定义的排序方法,我的自定义排序是这样写的:    

 

struct cmp
{
	bool operator()(const Edge* e1,const Edge* e2)
	{
		if(e1->weight >= e2->weight)
			return true;
		return false;
	}
};
     这种写法初看没有什么问题,但运行之后便出现了Expression: invalid operator< ,跟进之后发现该断言出现在algorithm的2457行,而最终抛出该assert的代码是这样写的:    

 

 

if (!_Pred(_Left, _Right))
       return (false);
else if (_Pred(_Right, _Left))
       _DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);

 

     这一段的代码的意思是,如果你交换cmp的两个要比较的元素的位置,得出的结果不能一样,也就是说,如果a比b小,则b肯定不会比a小 如果定义的函数既得出a比b小,又得出b比a小,那这个函数定义得肯定有问题. 所以对于我上面的cmp函数,如果有两个要比较的元素值相等的时候,就会出现这种情况,将>=改为>就行了,交换位置后就会得到不同的返回结果. 同理,很多人喜欢直接写成 return a-b  这样也是不行的; a b相等时返回值是相同的.        

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics