C++学习笔记6
对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数。
//错误: 不能为int重定义内置的运算符
int operator+(int, int);
1. lambda是函数对象
sort(words.begin(), words.end(), [](const string &a, const string &b){
return a.size() < b.size();
});
class ShorterString{
public:
bool perator()(const string &s1, const string &s2) const
{
return s1.size() < s2.size();
}
};
//ShorterString定义了函数运算符(), 使得ShorterString可以想函数一样调用
//我们可以用这个类替代lambda表达式
sort(words.begin(), words.end(), ShorterString());
//表示lambda及相应捕获行为的类
class SizeComp{
private:
size_t sz;
public:
SizeComp(size_t n): sz(n) { } //该形参对应捕获的变量
//该调用运算符的返回类型,形参和函数体都与lambda一致
bool operator()(const string &s) const
{
return s.size() >= sz;
}
};
find_if(words.begin(), words.end(), SizeComp(sz));
2. 可调用对象与function
// 普通函数
int add(int i, int j) { return i + j; }
//lambda 其产生一个未命名的函数对象类
auto mod = [](int i, int j) { return i % j; };
//函数对象类
struct divide{
int operator()(int denominator, int divisor){
return denominator / divisor;
}
};
#include <functional>
function<int(int, int)> f1 = add;
function<int(int, int)> f2 = divide();
function<int(int, int)> f3 = [](int i, int j) { return i * j; };
cout<<f1(4, 2)<<endl;
cout<<f2(4, 2)<<endl;
cout<<f3(4, 2)<<endl;