什么是仿函数:
通过代码进行分析:
#include<iostream>
#include<iterator>
#include<vector>
#include<algorithm>
using namespace std;
#define size 10
bool small(int x, int y) { return x > y; }
int rand100() {
return rand() % 100+1;
}
class Fun{
public:
bool operator()(int x, int y) {//重载函数运算符()
x = (x % 10) * 10 + (x / 10);
y = (y % 10) * 10 + (y / 10);
return x < y;
}
};
int main() {
vector<int> vi;
generate_n(back_inserter(vi), size, rand100);//back_inserter是一个后向的插入迭代器,将数从后面插入vi里面,并产生10个随机数
cout << "排序前:" ;
copy(vi.begin(), vi.end(), ostream_iterator<int>(cout, ","));//遍历并输出
//greater<int> gi; //通过STL自带的仿函数类对象进行排序
//sort(vi.begin(), vi.end(), gi);//通过仿函数类对象进行排序限制
sort(vi.begin(), vi.end(), Fun());//第三个参数作为函数指针所指向的常量函数名,也可以通过类重载函数运算符()变为仿函数进行传递
//注意Fun()括号不能省,因为此时把他当成一个匿名的Fun类匿名对象进行传递,和上面类似
cout << endl << "排序后:";
copy(vi.begin(), vi.end(), ostream_iterator<int>(cout, ","));//遍历并输出
}
在这里插入代码片
注意:运行结果是通过交换个位和十位之后,重新排序的,但是输出的排序后的数组还是按照没交换个十位的顺序排的,只是在内部进行了交换。
代码分析:
1.通过vector创建一个数组,通过back_inserter函数对数组进行插入100以内的随机数句,函数具体使用方法https://www.jianshu.com/p/6862a79eba0a。
2.通过copy函数将vector中的数据传递给输出流迭代器所指向的容器,并输出,用逗号隔开。
3.可以使用函数指针、仿函数对象(可以是匿名,也可以为非匿名)对排序规则进行限制。
4.再次使用copy进行输出