std::sort引发的core】的更多相关文章

#include <stdio.h> #include <vector> #include <algorithm> #include <new> struct foo_t { int size; }; class cmp_t { public: bool operator()(foo_t *a, foo_t *b) { return a->size >= b->size; } }; int main(int argc, char *argv…
http://note.youdao.com/noteshare?id=6aae09345e85ab55fe24ac959118a747…
其实昨天开发pds,就碰到了core,我还以为是内存不够的问题,或者其他问题. 今天把所有代码挪到了as这里,没想到又出core了. 根据直觉,我就觉得可能是std::sort这边的问题. 上网一搜,果然很多提到了这个问题. 原来 std::sort调用的方法,在相同元素这里,不能够返回true. 因为 std::sort()的排序分2种,当元素个数>16(_S_threshold)时选择快速排序,<=16个则选择插入排序(对象少时快排性能不理想).按照快排原理,每次都是遍历所有值和一个中间值…
最近碰到这样一个问题:我们从文件里读入了一组三维空间的点,其中有些点的X,Y,Z座标只存在微小的差别,远小于我们后续数据处理的精度,可以认为它们是重复的.所以我们要把这些重复的点去掉.因为数据量不大,这里不准备使用划分包围盒或者建立k-d tree这样的重型武器,我们简单的把点按照其三维坐标进行排序就好. 我们准备使用STL的std::sort来做这个排序.它要求提供一个符合如下签名的比较函数: bool cmp(const Type1 &a, const Type2 &b) 怎么样写这个…
大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块后(下面)用注释标明. template<class _RanIt, class _Diff, class _Pr> in…
在c++编程中使用sort函数,自定义一个数据结构并进行排序时新手经常会碰到这种错误. 这是为什么呢?原因在于什么?如何解决? 看下面一个例子: int main(int, char*[]) { struct ItemDesc { int val; std::string content; }; std::vector<ItemDesc> dataList = { ItemDesc{ , "hello" }, ItemDesc{ , "aello" },…
两年未写总结博客,今天先来练练手,总结最近遇到的一个crash case. 注意:以下的分析都基于GCC4.4.6 一.解决crash 我们有一个复杂的排序,涉及到很多个因子,使用自定义排序函数的std::sort做排序.Compare函数类似下文的伪代码: bool compare(const FakeObj& left, const FakeObj& right) { if (left.a != right.a) { return left.a > right.a; } if (…
参考: https://blog.csdn.net/u013346007/article/details/81877755 https://www.linuxidc.com/Linux/2017-01/140078.htm https://www.cnblogs.com/gccbuaa/p/7111480.html sort和stable_sort都是全排序函数,但是sort是非稳定排序算法,而stable_sort是稳定排序算法. #include "paixu.h" #includ…
众所周知,Std::sort()是一个非常快速的排序算法,它基于快排,但又有所修改.一般来说用它就挺快的了,代码一行,时间复杂度O(nlogn)(难道不是大叫一声“老子要排序!!”就排好了么...).我们也知道,不基于比较的排序可以达到O(n),比如说基数排序.什么,它是O(n * log(10)( max(n) ) ) 的?NO!!我们可以用sqrt(max(n))来作为进制,这样就是(N*logMax(n))=O(2*n)的了..看起来很不错, 代码量嘛....呵呵 所谓基数排序,就是做几次…
#include <algorithm> #include <functional> #include <array> #include <iostream> int main() { std::array<> s = { , , , , , , , , , }; // sort using the default operator< std::sort(s.begin(), s.end()); for (auto a : s) { std…
std::sort算是STL中对OIer比较友好的函数了,但你有想过sort是如何保证它的高速且稳定吗? 正文 我们首先来到第一层:sort函数 template<typename _RandomAccessIterator> inline void sort(_RandomAccessIterator __first, _RandomAccessIterator __last) { //申请使用随机访问迭代器 __glibcxx_function_requires(_Mutable_Rand…
Luogu P1177 [模板]快速排序 \(\Large{AC}\) 代码: #include<bits/stdc++.h> using namespace std; int n,a[100010]; bool cmp(int x,int y){ return x<y; } signed main(){ cin>>n; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n,cmp); for(int i=0;i<n;i…
delete [] ptr 引发了singnal 6 abort的core错误,跟踪过程发现写入ptr大量数据,引发内存越界,破坏了new数组的尾部数据保护,导致delete的时候core. 问题分析过程写了一段测试代码,发现另外一些编辑器或者说操作系统的性质,new申请的数组总是分配2的n次方的空间,比如char* ptr = new char[10]实际分配了16个字节的空间 ,char* ptr2 = new char[15]同样分配了16个空间的字节,而char* ptr3 = new…
排查一个死机问题,搞了好几天时间,最终确定原因:最终确定问题原因,在此分享一下: 第一步:常规根据core文件查看栈信息,gdb –c core xxxx 如下rip不正确,指令地址错乱,栈信息已破坏:在此基础上准确定位非常困难,但是仍可发现一些线索: 根据当前栈信息,大概寻找到怀疑的函数 查看整个栈上下信息,看有无怀疑的函数: 所以很有可能就是fetchNSAddrEv函数导致,需要重点关注: 更深入的细节,限于汇编不深入,比较难分析,不过可以有另外途径: 第二步:因为core是能复现出来,所…
由于之前在debug模式下发现stl的sort简直慢到不能忍,所以自己写了一个sgi的sort,后来发现在release模式下,vs自带的sort快的不行,就研究了下. 这里有些和sgi-stl相通的东西就简略带过了,详细内容可以看我之前的stl源码的笔记: sgi-sort_link 首先来看下大概的过程: 1.没有调用到一定深度时,就进行划分并进行递归调用. 2.如果超过了一定深度时,这个区间改为调用堆排序.(这一部待商榷) 3.对剩下的小于32长度的区间进行插入排序. 接下来是详细分析:…
一个偶然的机会,知道了std::once_call这个东西. 了解了下,std::once_call支持多线程情况下的某函数只执行一次.咦,这个不是恰好符合单例模式的多线程安全的困境吗? 单例模式,经常需要手写的经典面试题之一,很考验面试者的底子和水平.需要考虑的细节很多,其中多线程安全也是一个点. 本篇博文再次总结下单例模式,并且尽可能详细与完整,建议mark,面试前再回忆下(毕竟工作中直接有代码可以抄). 单例模式,在本人看来是全局变量的一种C++封装. 常规的C语言中,经常会在文件开头定义…
这个问题是面试腾讯光子的时候面试官提的,当时的问题是:sort自定义comp函数能用>=吗?当时的我想comp函数只要函数签名是对的应该就没问题吧,于是答了可以.面试结束后总感觉哪里不对,耿耿于怀,几番搜寻也只找到说要保证严格弱序,原理网上基本却没有.只能求助于源码了,打开<<STL源码剖析>>,看了一遍sort的实现,还是没能找出问题所在(这里要给自己提个醒,思考得不够).我不服,又在网上搜索了一遍结合源码,终于找到了答案. 首先补充一下满足严格弱序的3个条件: 1.两个关…
问题:sort的比较函数实现有问题导致进程调用sort时core了. 结论:特别要注意,sort的比较函数必须遵循严格弱排序(strict weak ordering)的规则.   这是最近在工作中遇到的一个问题,平时用函数就简单看了函数原型和例子,如无需要,没有去细究太多.结果在sort的使用就碰钉子,今天分享出来,大家也给自己提个醒.不多赘述,直接贴代码.   1. std::sort的调用   2. 比较函数compareFriUser   编译是没问题的,但是运行到这里就会导致core.…
http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/ 先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定).集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决排序这个问题.所谓三路划分,是指把数组划…
bind - boost 头文件: boost/bind.hpp bind 是一组重载的函数模板. 用来向一个函数(或函数对象)绑定某些参数. bind的返回值是一个函数对象. 它的源文件太长了. 看不下去. 这里只记下它的用法: 9.1 对于普通函数 假如有函数 fun() 如下: void fun(int x, int y) { cout << x << ", " << y << endl; } 现在我们看看怎么用bind 向其绑定参…
#gcc version 4.5.3 (GCC) #include <iostream> #include <algorithm> template <typename ARRAY_TYPE, typename INDEX_TYPE> void bubble_sort(ARRAY_TYPE array[], INDEX_TYPE size) { bool done = false; while(!done) { done = true; for(INDEX_TYPE i…
STL中有一个std::sort算法,但它是不支持std::list的,因为list不提供RandomIterator的支持,但list自己提供了sort算法,把list的元素按从小到大的方式来排序,代码长度到不长,但真是难以读懂,后来扣持了一下午终于搞明白了,贴个总结上来. list::sort的代码如下(sgi stl): [cpp] view plaincopy template <class _Tp, class _Alloc> void list<_Tp, _Alloc>…
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 如下: #include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> using std::sort; using std::swap; ; struct node{ int val, pos; }rec[]; inline bool cmp(const node &am…
主要内容: 1.qsort的用法 2.sort的用法 3.qsort和sort的区别 qsort的用法: 原 型: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 功 能: 使用快速排序例程进行排序 参 数: 1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序 说 明:qsort函数是ANSI C标准中提供的,其…
前段时间,需要做一个功能是要做文件系统的排序的功能.由于是自己写的model, 自己定义的数据结构.最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间.后来想到的是QFileSystemModel就是Qt标准的文件系统的model,可以把里面关于排序的算法提出来,没有必要重复造轮子.看了一下QFileSystemModel的源码,找到的排序算法如下(主要单元在qfilesystemmodel.cpp): 1)文件系统的文件名排序主要涉及到文件夹跟文件的顺序(文件夹要排在文件…
先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定).集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决排序这个问题.所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分. 具体介绍:-^^ void qsort( void *base, size_t n…
参考:http://blog.csdn.net/s030501408/article/details/5329477 0)与C标准库qsort的比较:http://bbs.csdn.net/topics/330202688 std::sort()比C标准库qsort快是肯定的,能快一倍,对于这一点的解释向来有两种,并且从STL的源码中也得到了确认. 一种是sort不是快速排序,而是多种排序的结合,这一点得到确认,STL的sort源码中可以看到快速排序.堆排序.归并排序等多种排序方式的结合,但是q…
先了解下什么都有什么排序算法 https://en.wikipedia.org/wiki/Sorting_algorithm http://zh.wikipedia.org/zh/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95 http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.7.1.1.htm 希尔排序 O(n1.25) 二叉排序树排序 (Binary tree sort) — O(n…
排序算法为竞赛中最常用的算法之一,我们可以利用C++自带的库函数进行排序.                                                                                      ————<信息学奥赛一本通> #include<iostream> #include<algorithm> int main() { ]; int n; std::cin>>n; ;i<n;i++) { std…
转自:http://www.wl566.com/biancheng/98907.html C++<algorithm>中sort的比较函数写法,有需要的朋友可以参考下. 定义排序函数: 方法1:声明外部比较函数 bool Less(const Student& s1, const Student& s2) { return s1.name < s2.name; //从小到大排序 } std::sort(sutVector.begin(), stuVector.end(),…