lambda表达式的作用

非传统讲解lambda表达式

我想学过c++的朋友对lambda表达式都不是很陌生,看着好像很高端,其实就是匿名函数,主要目的是减少函数的封装,优化代码量。
lambda的格式:[外部变量访问方式说明符] (参数表) -> 返回值类型 { 语句块 }
外部变量访问方式说明符:“&”:引用访问 ;“=”:赋值
关于lambda的使用讲解,请看链接:lambda表达式详解
我在这里主要讲下lambda的使用场合,就我目前的日常使用中,其实lambda主要在2个地方比较多。

1.排序中比较函数参数:
当调用排序时如果是对自定义对象进行排序,那么sort算法并不知道两个对象的大小关系,所以需要传入比较函数,去自定义对象的比较规则。

int a[4] = {11, 2, 33, 4};
sort(a, a+4, [=](int x, int y) -> bool { return x%10 < y%10; } );
for_each(a, a+4, [=](int x) { cout << x << " ";} );

2.在QT中作为槽函数

我们来举一个例子:下课时间到,老师说下课,或者等10分钟,学生就是 老师再见,或是哎,好饿。
先看代码:

//student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
    Q_OBJECT
public:
    explicit Student(QObject *parent = nullptr);
signals:
public slots:
    void todo(QString comment);
};
#endif // STUDENT_H

//student.cpp
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
 void Student::todo(QString comment)
 {
     if(comment.compare("下课") == 0 )
         qDebug()<<"离开" ;
     else
          qDebug()<<"哎,好饿!";
 }

//teacher.h
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
    Q_OBJECT
public:
    explicit Teacher(QObject *parent = nullptr);
signals:
    void comment(QString comment);
public slots:
};
#endif // TEACHER_H

//teacher.cpp
#include "teacher.h"
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
//mainwindows.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <student.h>
#include <teacher.h>
#include <QMainWindow>
#include <QPushButton>
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Teacher* th;
    Student* st;
    QPushButton* btn;
};
#endif // MAINWINDOW_H

//mainwindows.cpp
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),
      th(new Teacher),
      st(new Student),
      btn(new QPushButton)
{
    resize(600,400);
    btn->setText("下课铃响");
    btn->setParent(this);
    btn->resize(60,40);
    btn->move(280,300);
    QObject::connect(btn,&QPushButton::clicked,th,[=](){emit th->comment("留10分钟");});
    QObject::connect(th,&Teacher::comment,st,&Student::todo);
}
MainWindow::~MainWindow()
{
}

其中,按键点击时,使用的是信号传型号,但是clicked为bool型的参数,那么链接的槽或者信号必须参数少于或等于bool,如果直接链接teacher的信号,则会出现2个问题,第一,编译出错,参数不匹配,第二,无法传参。所以可以使用lambda表达式,结合emit发射信号。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值