大家好,欢迎来到IT知识分享网。
最近项目中为了将不同记录整合到到同一个记录,同时扩展记录的深度,为了方便查看需将记录以时间先后排序,想到了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中有很多很好用的函数和数据结构,在没有仔细阅读使用手册的情况下,按照自己的理解去使用它们有时会导致出现不可预估的结果,这个时候参阅这两本书籍和说明文档是十分有用的。
结束语:
多读书,多思考。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23184.html