底层实现原理————函数对象
/*
Lambda格式:[捕获外部变量](形参列表)->返回值{操作代码}; 等同于创建了一个类模板,并实例化
[捕获外部变量]:
[]: 不捕获任何外部变量
[=]: 传值捕获外部变量
[&]: 传引用捕获外部变量
[this]: 捕获外部this指针
[=,&a]: 传值捕获所有外部变量,但传引用捕获变量a
[a,b]: 指定传值捕获外部变量a和b
[a,&b]: 传值捕获a,传引用捕获b
*/
template<typename T = void> // 模板类型void
class Lambda1
{
public:
Lambda1() {} // 构造函数负责捕获外部变量,等于lambda的[]
T operator()() const // 重载(),对参数列表进行操作,等于lambda的()
{
cout << "test1" << endl;
}
};
template<typename T = int>
class Lambda2
{
public:
Lambda2() {}
T operator()(T a, T b) const
{
return a + b;
}
};
template<typename T = int>
class Lambda3
{
private:
T& _a, & _b;
public:
Lambda3(T& a, T& b) :_a(a), _b(b) {}
void operator()() const
{
T tmp = _a; _a = _b; _b = tmp;
cout << _a << ' ' << _b << endl;
}
};
int main()
{
auto func1 = []()->void {cout << "test1" << endl; }; // 类似于产生了一个函数对象
//auto func1 = []() {cout << "test1" << endl; }; // 如果不需要返回值,可以省略->
func1();
Lambda1<> t1; // 实例化函数对象并重载()输出想要干的事情
t1();
cout << "=========================================================" << endl;
auto func2 = [](int a, int b)->int {return a + b; };
cout << func2(10, 20) << endl;
Lambda2<> t2;
cout << t2(10, 20) << endl;
cout << "=========================================================" << endl;
int a = 10, b = 20;
auto fun3 = [&a, &b]()mutable // 传引用传入外部变量ab,因为是常量所以要用mutable强制swap
{
int tmp = a; a = b; b = tmp;
cout << a << ' ' << b << endl;
};
fun3();
Lambda3<> t3(a, b);
t3();
cout << "=========================================================" << endl;
return 0;
}
一些实例
// Lambda用在一些泛型算法中比较好用,避免再去类中实现仿函数(重载operator())产生开销
int main()
{
vector<int> vec;
for (int i = 1; i < 10; i++)
vec.push_back(rand() % 100 + 1);
sort(vec.begin(), vec.end(), [](int a, int b)->bool {return a < b; });
// 使用Lambda实现cmp排序的过程
for (auto c : vec)
cout << c << ' '; cout << endl;
cout << "=========================================================" << endl;
// 如果想要在vec中按序插入34,首先需要找到合适的位置
auto it = find_if(vec.begin(), vec.end(),
[](int a)->bool {return 34 < a; });
if (it != vec.end())
vec.insert(it, 34); // 如果存在一个位置第一次大于34,在该位置插入
for (auto c : vec)
cout << c << ' '; cout << endl;
cout << "=========================================================" << endl;
for_each(vec.begin(), vec.end(),
[](int a) { // 返回值是void,不用写->
if (a % 2 == 0)
cout << a << ' '; });
return 0;
}
函数指针叠加lambda
int main()
{
int (*p)(int, int) = nullptr; // 函数指针
p = [](int a, int b)->int {return a < b ? a : b; }; // p指向lambda函数
cout << p(11, 2) << endl;
[]() {cout << "打印"; }(); // 只做一个打印的效果,注意后面的(),这是一个函数
return 0;
}