用仿函数实现保留索引的排序

来源:互联网 发布:软件系统租赁合同 编辑:程序博客网 时间: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;}

这里写图片描述

原创粉丝点击