C++ sort函数出现段错误

最近项目中为了将不同记录整合到到同一个记录,同时扩展记录的深度,为了方便查看需将记录以时间先后排序,想到了c++自带的排序函数,匆忙下手,没注意函数使用细节,导致程序出现段错误,通过coredump定位到sort函数中的comp函数出了问题,随即加了调试信息,sort函数从开始未执行结束就出现了段错误,当即找到度娘,发现以下使用说明:

template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
 
comp:
    Binary function that accepts two elements in the range as arguments, and returns a value convertible tobool. The value returned indicates whether the element passed as first argument is considered to go before the second in the specific strict weak ordering it defines.
The function shall not modify any of its arguments.
This can either be a function pointer or a function object.

(翻译:comp是一个接受两个表示范围的元素作为参数的二元函数,它返回一个可转成bool的值。返回值指示了在comp定义的特定的严格弱排序中,第一个参数是否应该排在第二个参数之前。comp函数不会改变任何一个参数,它可以是一个函数指针或一个仿函数。)

我们注意到该说明提到了comp参数必须是严格弱排序。网上的一个较好的解读是:严格是说在判断的时候会用"<",而不是"<=",弱排序是因为,一旦"<"成立便认为存在"<"关系,返回ture,而忽略了"="关系和">"区别,把它们归结为false。

而这样的比较函数之所以会导致sort内部调用core是因为sort内部的排序函数不会进行边界检查,使用 == 会导致其取到不正确的元素地址。(该问题可以去仔细研读sort的具体实现)

关于以上的问题,在《Effective STL》的条款20和21都有提到,《STL源码剖析》关于sort函数源码也有详细的解读。大家可以去阅读一下。尤其是STL中有很多很好用的函数和数据结构,在没有仔细阅读使用手册的情况下,按照自己的理解去使用它们有时会导致出现不可预估的结果,这个时候参阅这两本书籍和说明文档是十分有用的。

结束语:

    多读书,多思考。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值