BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #86064同步于 2015/3/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

sort问题

libenchao
2015/3/19镜像同步7 回复
下面这段代码,会产生segmentation fault,请诸位大神帮忙看一下,这段代码到底哪里有问题。 我测试了一下,comp中如果是始终返回true就会segmentation fault,如果是始终返回false,就没有问题。 莫非是sort的原因?? #include<string> #include<iostream> #include<vector> #include<algorithm> using namespace std; class Test{ public: string hehe(vector<int> &num){ sort(num.begin(),num.end(),comp); string ans; for(auto i :num){ ans += to_string(i); } return ans; } static bool comp(int x,int y){ return true; } }; int main(){ vector<int> num(100,0); Test t; cout << t.hehe(num) << endl; return 0; }
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
wangxiaobupt机器人#1 · 2015/3/19
我也没懂为什么 不过把num(100,0)改成(10,0)就能过了
libenchao机器人#2 · 2015/3/19
100,0只是我在随便测试功能时用的,但是感觉这个错误不应该跟n的数量有关才对的啊。 【 在 wangxiaobupt 的大作中提到: 】 : 跟sort没关系 我也没懂为什么 不过把num(100,0)改成(10,0)就能过了
libenchao机器人#3 · 2015/3/19
我自己又思考了一下这个问题,应该是sort需要的函数是一个重载的小于函数,也就是说它把等于当做false。然后就可以解释通了。而且当我重载的函数中采用return x < y;的时候,数据都相同是没有问题的;但是当采用return x <= y的时候,就会出现问题了。 这个问题告诉我们,实现的函数一定要是把相等归到false的判定中,要不然sort中排序会出现问题。
moonfighting机器人#4 · 2015/3/19
这和STL里的sort内部实现有关 下面这段代码是导致出错的原因 template<class _Pr, class _Ty1, class _Ty2> inline bool _Debug_lt_pred(_Pr _Pred, _Ty1&& _Left, _Ty2&& _Right, _Dbfile_t _File, _Dbline_t _Line) { // test if _Pred(_Left, _Right) and _Pred is strict weak ordering if (!_Pred(_STD forward<_Ty1>(_Left), _STD forward<_Ty2>(_Right))) return (false); else if (_Pred(_STD forward<_Ty2>(_Right), _STD forward<_Ty1>(_Left))) _DEBUG_ERROR2("invalid operator<", _File, _Line); return (true); } 简单点说,这段代码就是检测left 和 right 的迭代器指向的值,pred 就是你自己定义的比较函数。if和else if这两个判断条件必须得有一个为真,要么left < right ,要么left >= right, 不能既left < right 又right > left,你讲comp函数的返回值设为永远true,那么那两个条件就全为真,那么就出错。如果设为永远false,那么进行第一个if判断时就成立聪儿直接返回false ,所以不会出错。 我这是vs2013里的代码,linux下的STL应该也差不了多少 【 在 libenchao 的大作中提到: 】 : 下面这段代码,会产生segmentation fault,请诸位大神帮忙看一下,这段代码到底哪里有问题。 : 我测试了一下,comp中如果是始终返回true就会segmentation fault,如果是始终返回false,就没有问题。 : 莫非是sort的原因?? : ...................
wangxiaobupt机器人#5 · 2015/3/19
之前看到return true;的时候感觉有点怪,一般要么递增要么递减 我要以为也能这么用 原来这样不行= = 【 在 libenchao 的大作中提到: 】 : 我自己又思考了一下这个问题,应该是sort需要的函数是一个重载的小于函数,也就是说它把等于当做false。然后就可以解释通了。而且当我重载的函数中采用return x < y;的时候,数据都相同是没有问题的;但是当采用return x <= y的时候,就会出现问题了。 : 这个问题告诉我们,实现的函数一定要是把相等归到false的判定中,要不然sort中排序会出现问题。
libenchao机器人#6 · 2015/3/19
谢大神指点,我自己只是猜测这里会有问题,看了大神的贴出来的代码,终于确定了自己的猜想。 【 在 moonfighting 的大作中提到: 】 : 这和STL里的sort内部实现有关 下面这段代码是导致出错的原因 : [code=c] : template<class _Pr, class _Ty1, class _Ty2> inline : ...................
iloahz机器人#7 · 2015/3/19
因为不是偏序没法排呀