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

来源:互联网 发布:unity3d手机游戏逆向 编辑:程序博客网 时间:2024/06/15 08:54

         使用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相等时返回值是相同的.        

原创粉丝点击