stable_sort()函数易错点

news/发布时间2024/5/15 20:48:17

释义

  该函数接受三个参数,stable_sort(first ,last ,cmp)(这里只是简单表示一下,并不是函数原型, cmp可以不用,默认为升序);这个函数的作用是对容器进行排序,并保证其稳定性(相等元素排序前后的相对位置不变)。

Sorts the elements in the range [__first,__last) in ascending order, such that for each iterator i in the range [__first,__last-1), __comp((i+1),i) is false. The relative ordering of equivalent elements is preserved, so any two elements x and y in the range [__first,__last) such that __comp(x,y) is false and __comp(y,x) is false will have the same relative ordering after calling stable_sort().

问题

cmp参数

  下面是关于cmp函数的相关介绍

Binary function that accepts two elements in the range as arguments, and returns a value convertible to `bool`. 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.

  cmp()函数的参数不可以是引用(但可以用是 常引用 或 值传递)举一个例子吧

	/* 省略函数体 */bool cmp_1(int x, int y){}    //值传递,允许bool cmp_2(const int &x, const int &y){} //常引用,允许bool cmp_3(int &x, int &y){} //引用,不允许

cmp比较源码

  这里有一些让人费解的地方,对于以下两个函数来说,stable_sort()产生的结果是一样的吗?

bool cmp_1(int x,int y) {return x > y;
}bool cmp_2(int x,int y) {return x >= y;
}

  思考一下,如果传入 x 的值和传入 y 的值在相等的情况下是否是一样的(这里包括稳定性),举个例子(用结构体帮助观察相对位置是否发生改变)

#include <iostream>  
#include <vector>  
#include <string>  
#include <algorithm>  struct Student {  std::string str;  int num;  
};  bool cmp_1(const Student &x, const Student &y) { return x.num > y.num; }  bool cmp_2(const Student &x, const Student &y) { return x.num >= y.num; }  int main() {  auto *p = new Student[]{{"a", 2},  {"b", 2}};  /* 正确 */std::stable_sort(p, p + 2, cmp_1);  std::cout << p->str << ' ' << (p + 1)->str << std::endl;  /* 错误 */std::stable_sort(p, p + 2, cmp_2);  std::cout << p->str << ' ' << (p + 1)->str;  delete[] p;  return 0;  
}/*
输出的结果是:a bb a
*/

  可以看出 cmp_1 和 cmp_2 的结果是不同的,为什么 cmp_2 作为参数时stable_sort()不保证容器的稳定性呢? 这涉及到”函数源码“了?


Sorts the elements in the range [__first,__last) in ascending order, such that for each iterator i in the range [__first,__last-1), __comp(*(i+1),*i) is false.

  这里要保证 __comp(*(i+1),*i) is false,这个与我一直以为的__comp(*i,*(i+1)) is true 是不同的,所以 cmp_ 2 return x >= y 在遇到相等元素时会返回 true 不满足这个要求,所以会出错,这是第一个要注意的点。

第二个要注意的是满足Strict Weak Ordering 有以下几点要求:
1.Irreflexivity: f(x, x) must be false.
2.Antisymmetry: f(x, y) implies !f(y, x)
3.Transitivity: f(x, y) and f(y, z) imply f(x, z).

参考

  1. https://cplusplus.com/reference/algorithm/stable_sort/
  2. https://www.boost.org/sgi/stl/StrictWeakOrdering.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/27136356.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

04-drf视图层详细

drf的request请求 这里的request请求是基于APIView的,也就是新的request 正常情况下,request请求分为:urlcoded、json、form-data,可以控制只接受哪一个请求导入模块 from rest_framework.parsers import JSONParser, MultiPartParser, FormParser模块 描述 请求JSONParser…

缓存数据“消失”之谜

吃一堑,长一智。吃一堑,长一智。“邪门!真是邪门!”自从踏入 Go 的领域之后,奇事怪事接连不断。很多看上去似乎没啥问题的代码,可就是有问题,可怎么也看不出问题所在。问题背景 事情是这样的:有两个流程和一个缓存数据: 流程一:接收 kafka 数据,解析模型数据,并存入…

Python调用微信OCR识别文字和坐标

原理 在看雪看到一篇文章:逆向调用QQ截图NT与WeChatOCR-软件逆向。里面说了怎么调用微信和QQ本地的OCR模型,还有很详细的分析过程。 我稍微看了下文章,多的也看不懂。大概流程是使用mmmojo.dll这个dll来与WeChatOCR.exe做通信的,也是用它来启动和关闭WeChatOCR.exe进程的。…

泰国股票盘搭建【TG:@Gangguhk】

功能最强大的股票配资系统 我们的股票配资系统是由拥有10年项目开发经验的资深技术人员,针对股票配资市场情况及股票投资者需要而精心研发,可同时运行于手机端、电脑端的多屏杠杆融资风控管理系统。功能包括自设配资额度、多级代理、交易管理、客户管理、警戒平仓、系统监控、…

openGauss AI4DB-数据库自治运维

AI4DB: 数据库自治运维 如上文所述,AI4DB主要用于对数据库进行自治运维和管理,从而帮助数据库运维人员减少运维工作量。在实现上,DBMind的AI4DB框架具有监控和服务化的性质,同时也提供即时AI工具包,提供开箱即用的AI运维功能(如索引推荐)。AI4DB的监控平台以开源的Prome…

服务端测试开发必备技能:Mock测试

什么是mock测试 Mock 测试就是在测试活动中,对于某些不容易构造或者不容易获取的数据/场景,用一个Mock对象来创建以便测试的测试方法。 Mock测试常见场景无法控制第三方系统接口的返回,返回的数据不满足要求 依赖的接口还未开发完成,就需要对被测系统进行测试Mock测试的缺点…