用仿函数实现保留索引的排序
来源:互联网 发布:软件系统租赁合同 编辑:程序博客网 时间:2024/04/28 13:35
如果对一个数组按照元素的值排序会丢掉它之前的索引号,如果想要保留索引,就相当于对之前的索引数组,以索引位置的元素值的大小为依据,进行排序,即对idx(索引号)按照一定的规则排序,而这个规则依赖于val(索引位置的元素值)。这就需要在sort函数的第三个参数cmp上动手脚,通过仿函数实现。
仿函数(functor),是一个类,使用起来像一个函数。它的实现就是类中重载一个operator(),这个类就有了类似函数的行为,就是一个仿函数类。
例子:
val数组是int val[3] = { 1, 3, 2 };
假设排序前对应的索引是int idx[3] = { 0, 1, 2 };
那么按照从大到小的顺序(321)排序后索引应该是120。
这里重载的()和最基本的sort函数的cmp自定义函数写法是一样的。
分析
使用时cmp看起来像个以val为参数的函数,其实是实现了一个cmp类,这个对象的buf成员被赋值为val,这时再使用这个对象的成员函数operator()时,就可以直接以buf成员为依据,对idx进行排序了。
如果不用这种方法就得使用全局变量或者改变之前的数据结构(把val和idx合成一个结构体)
#include <algorithm>class cmp{public: int *buf; cmp(int *p) :buf(p){} bool operator()(int a, int b) { return buf[a] > buf[b]; }};int main(){ int val[3] = { 1, 3, 2 }; int idx[3] = { 0, 1, 2 }; std::sort(idx, idx + 3, cmp(val)); printf("idx of val from big to small: %d %d %d\n", idx[0], idx[1], idx[2]); system("pause"); return 0;}
阅读全文
0 0
- 用仿函数实现保留索引的排序
- 高级冒泡排序-->用模板仿函数再次实现
- 用仿函数实现以std::string作为key的map自定义排序
- python排序,保留索引值
- 快速排序模板方法,只实现了int比较的仿函数
- c++ ——排序并保留索引
- 仿函数(functor)的简单实现
- 堆的简单实现(仿函数)
- 仿联系人的排序
- 用sorted函数实现字典的排序
- 用OpenCV的仿射变换函数warpAffine实现图像的任意角度旋转!
- 仿通讯录快速索引的实现原理(包括中间的字母图和右边的索引条),例IndexableListView
- 使用仿函实现函数参数的部分自动填充
- 实现大堆小堆——仿函数的应用
- STL — 仿函数的实现原理和应用
- 仿函数的使用
- 仿函数的回顾
- 仿函数的使用
- Java web学习总结4:Http协议 Http协议常用的消息头汇总
- oracle中,为什么同样是对汉字进行排序,两个库的排序结果不一样?
- 常用类--Java中的日期类、数学类
- Android加载大分辨率图片到手机内存中的实例方法
- .net 全角半角转换
- 用仿函数实现保留索引的排序
- 在Js中网页跳转的写法
- addView导致子布局“match_parent”属性失效详解
- 让sublime text3支持Vue语法高亮显示
- Java web学习总结5 : Servlet开发
- SQL入门经典(第5版)第四章 规格化过程
- mysql-5.7.14免安装版的配置
- cent os 免密码登录SQL
- 打开页面自动弹窗