Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >std库sort排序函数的crash

std库sort排序函数的crash

原创
作者头像
mariolu
发布于 2023-05-26 08:44:42
发布于 2023-05-26 08:44:42
5240
举报

某天一个同事在做代码版本升级

Qt4 to Qt5 - Obsolete Members for <QtAlgorithms>

  • qSort => std::sort & qSort(list) => std::sort(list.begin, list.end)
  • qStableSort => std::stable_sort & qStableSort(list) => std::stable_sort(list.begin, list.end)
  • qGreater => std::greater
  • qLess => std::less
  • qSwap => std::swap

按照这个规则,其中有一行代码

代码语言:txt
AI代码解释
复制
        qSort(_rawDataList2.begin(), _rawDataList2.end(), callback);

改成

代码语言:txt
AI代码解释
复制
        std::sort(_rawDataList2.begin(), _rawDataList2.end(), callback);

但是这样改却引起了程序的crash。

根据经验,crash在std底层库,那肯定是一些通用性的问题,于是在谷歌上检索到这么一条有用信息。实现std::sort的比较函数 lessThan(const T& left, const T& right) {/满足严格排序/} 需要满足以下规则。

strict weak ordering

This is a mathematical term to define a relationship between t>wo objects.

Its definition is:

Two objects x and y are equivalent if both f(x, y) and f(y, x) are false. Note that an object is always (by the irreflexivity invariant) equivalent to itself.

这里有个关键的一点是,如果两个被比较的对象相等,那么比较函数需要满足 lessThan(left, right) == lessThan(right, left) = false。

在C++中,我们穷举两个被比较对象的所有可能,一个"operatior <()的函数" 他的规则应该如下表示,

X a;

X b;

Condition:

Test:

Result

a is equivalent to b

a < b

false

a is equivalent to b

b < a

false

a is less than b

a < b

true

a is less than b

b < a

false

b is less than a

a < b

false

b is less than a

b < a

true

如果不遵循这个规则,设计了比较函数,那么std::sort可能会陷入死循环,进而导致crash。

而QT的qSort没有这个问题。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
看看Qt里那些使用了匿名函数
匿名函数也可以被叫做Lambda表达式,自C++11中引入该特性。本文主要介绍Qt里使用到的匿名函数。 1. connect中使用 connect中可以使用匿名函数代替槽函数进行一些简单操作。 原型: //connect to a functor template <typename Func1, typename Func2> static inline typename std::enable_if<QtPrivate::FunctionPointer<Func2>::ArgumentCount ==
Qt君
2019/07/25
8700
工作两年了,还只会用sort进行排序?
算法 条款27:确保目标区间足够大 //思考这样一个问题:stl容器被添加时(insert, push_front,push_back)自动扩展它们自己来容纳新对象,是不是就不必担心要为容器的对象腾出空间了? //transform:https://blog.csdn.net/lanzhihui_10086/article/details/42342893 //1,四个参数,源区间的元素转换到目标区间,复制和修改一起做 //2,五个参数,将前两个原序列中的元素合并,并将结果写入目标区间 //看例子1 int
用户9831583
2022/12/04
9200
qsort(),sort()排序函数
一.qsort()函数 功 能: 使用快速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *)); 参数: 1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序 qsort(即,quicksort)主要根据你给的比较条件给一个快速排序,主要是通过指针移动
猿人谷
2018/01/17
2.1K0
对vector等STL标准容器进行排序操作
STL几乎封装了所有的数据结构中的算法,从链表到队列,从向量到堆栈,对hash到二叉树,从搜索到排序,从增加到删除......可以说,如果你理解了STL,你会发现你已不用拘泥于算法本身,从而站在巨人的肩膀上去考虑更高级的应用。
bear_fish
2018/09/20
2.5K0
9.1 C++ STL 排序、算数与集合
C++ STL(Standard Template Library)是C++标准库中的一个重要组成部分,提供了丰富的模板函数和容器,用于处理各种数据结构和算法。在STL中,排序、算数和集合算法是常用的功能,可以帮助我们对数据进行排序、统计、查找以及集合操作等。
微软技术分享
2023/08/17
2250
ACM竞赛常用STL(二)之STL--algorithm
<algorithm>无疑是STL 中最大的一个头文件,它是由一大堆模板函数组成的。 下面列举出<algorithm>中的模板函数: adjacent_find / binary_search / copy / copy_backward / count / count_if / equal / equal_range / fill / fill_n / find / find_end / find_first_of / find_if / for_each / generate / generate_n / includes / inplace_merge / iter_swap / lexicographical_compare / lower_bound / make_heap / max / max_element / merge / min / min_element / mismatch / next_permutation / nth_element / partial_sort / partial_sort_copy / partition / pop_heap / prev_permutation / push_heap / random_shuffle / remove / remove_copy / remove_copy_if / remove_if / replace / replace_copy / replace_copy_if / replace_if / reverse / reverse_copy / rotate / rotate_copy / search / search_n / set_difference / set_intersection / set_symmetric_difference / set_union / sort / sort_heap / stable_partition / stable_sort / swap / swap_ranges / transform / unique / unique_copy / upper_bound 如果详细叙述每一个模板函数的使用,足够写一本书的了。还是来看几个简单 的示例程序吧。 示例程序之一,for_each 遍历容器:
xindoo
2021/01/22
9440
sort() function
我在之前的博客中提到,解决排序问题的一个好用的函数就是C++的sort()函数啦。sort()函数是C++内置的函数,只需要加入头文件,掌握正确的使用方法,你就可以在排序中驰骋疆场了(自吹自擂)。好啦,下面就请主角登场吧
AngelNH
2020/04/15
1.3K0
sort() function
【C++】STL 算法 ⑥ ( 二元谓词 | std::sort 算法简介 | 为 std::sort 算法设置 二元谓词 排序规则 )
" 谓词 ( Predicate ) " 是一个 返回 布尔 bool 类型值 的 函数对象 / 仿函数 或 Lambda 表达式 / 普通函数 , 可用于对某个条件进行检查 ;
韩曙亮
2024/01/08
2750
【C++】STL 算法 ⑥ ( 二元谓词 | std::sort 算法简介 | 为 std::sort 算法设置 二元谓词 排序规则 )
深度解析C++中的map的使用
map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持小于比较,如果不支持或者需要的话可以自行实现仿函数传给第二个模版参数,map底层存储数据的内存是从空间配置器申请的。一般情况下,我们都不需要传后两个模版参数。map底层是用红黑树实现,增删查改效率是O(logN),迭代器遍历是走的中序,所以是按key有序顺序遍历的。
凯子坚持C
2025/01/04
550
C++20初体验——concepts
凡是涉及STL的错误都不堪入目,因为首先STL中有复杂的层次关系,在错误信息中都会暴露出来,其次这么多类和函数的名字大多都是双下划线开头的,一般人看得不习惯。
huofo
2022/03/17
1.4K0
链表和C++ std::list详解
链表是一种在物理上非连续、非顺序的数据结构,数据元素的逻辑顺序是通过链表中的指针链接实现,其由若干节点所组成。std::list是C++中支持常数时间从容器任何位置插入和移除元素的容器,但其不支持快速的随机访问,其通常实现为双向链表。
艰默
2023/09/05
1.6K0
链表和C++ std::list详解
“快排”笔记
  关于排序,我想没有多少程序员会感觉陌生,信手拈来的可能就有不少:冒泡、选择或者归并等等;可在实际开发中,排序又让许多程序员感到很不熟悉,因为在大多数情况下,自己实现一个排序算法都不是一个好主意,相反的,改而使用语言框架内建提供的排序功能才是明智之举,毕竟她又方便又高效……
用户2615200
2018/08/02
6460
单向链表和C++ std::forward_list详解
上一章我们介绍了双向链表和C++容器库中提供的std::list容器,与之对应的就是单向链表,顾名思义,单向链表只记录下一个元素的位置,只能朝一个方向遍历元素。C++11从开始提供了std::forward_list(前向列表)来实现单向链表。std::forward_list在插入、删除和移动操作(例如排序)中比其他容器更有用,并且允许时间常数内插入和删除元素。
艰默
2023/09/05
5070
单向链表和C++ std::forward_list详解
C++11 信号槽 signal/slot
最近在看陈硕大大 的《Linux 多线程服务端编程:使用 muduo C++ 网络库》  ,看到里面用variadic template 和boost智能指针 实现了一个 signal/slot,现在C++11 已经把 boost的智能指针引入到标准库里边了。就想利用纯C++11 实现一遍。
用户7886150
2021/04/26
1.5K0
C++学习之路—— STL标准模板库概述
1、map容器和vector容器的区别? map 是关联容器的一种,map 的每个元素都分为关键字和值两部分,容器中的元素是按关键字排序的,并且不允许有多个元素的关键字相同。 vector 是顺序容器,元素在其中按顺序存储,链表容器中内存不一定连续,但是按下标顺序存储的,每个元素都有唯一对应的位置编号 2、map容器和set容器的区别? set 是关联容器的一种,是排序好的集合(元素已经进行了排序)。且set容器中不能有重复的元素,set容器中元素的值不能直接修改。而Map不能直接修改 map 容器中的关键字。 map是带键值的容器,值是一个pair。 set是存储值的容器。 3、map容器和list容器的区别? list 是顺序容器的一种。map是带键值的容器,值是一个pair。 list本身是一个双向链表。 4、编写一个程序,来统计从键盘上输入单词的个数,如果碰到大写字符则不统计。
全栈程序员站长
2022/09/23
5960
C++学习之路—— STL标准模板库概述
【C++】map和set的介绍及使用
map和 set 是 C++ STL(标准模板库)中的两种非常重要的容器,它们基于一种叫做平衡二叉搜索树(通常是红黑树)的数据结构来实现。在 C++ 中,map 是一个键值对容器,set 只存储唯一的键,而这两个容器都通过二叉树的结构来保持数据的有序性和高效的查找、插入、删除操作。
用户11375356
2024/11/22
800
【C++】map和set的介绍及使用
sort函数对vector排序_sort函数对结构体数组排序
今天写代码的是遇到想对vector进行排序的问题,隐约记得std::sort函数是可以对vector进行排序的,但是这次需要排序的vector中压的是自己定义的结构体(元素大于等于2),想以其中某一个元素进行正序或逆序排序,则不能直接使用sort函数。
全栈程序员站长
2022/09/21
1.7K0
一些关于广泛使用的C++标准库STL的思考
就算typedef对于提高运行速度可能没有什么实质性的帮助,但是它对于撰写你的代码是会有帮助的,你总不会喜欢一直重复的去写:
看、未来
2021/09/18
4690
【c++】优先级队列与仿函数:C++编程的强大组合
s在 C++ 的 std::priority_queue` 实现中,默认情况下,优先级是用元素之间的小于操作来判定的,即元素越大优先级越高
用户11029103
2024/05/06
1600
【c++】优先级队列与仿函数:C++编程的强大组合
C++ STL 标准模板库(排序/集合/适配器)算法
C++ 标准模板库STL,是一个使用模板技术实现的通用程序库,该库由容器container,算法algorithm,迭代器iterator,容器和算法之间通过迭代器进行无缝连接,其中所包含的数据结构都是目前最优解,该库既能保证软件代码的高可复用性,又能保证代码具有相当高的执行效率,STL库是ANSI/ISO的C++标准的具体实现,任何标准库的实现都是以源码形式释出的.
微软技术分享
2022/12/28
6560
相关推荐
看看Qt里那些使用了匿名函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文