【C++篇】C++11新特性总结2

目录

1,可变参数模板

1.1,基本语法及原理

1.2,包扩展 

4.3,emplace系列接口 

2,新的类功能

2.1,默认的移动构造和移动赋值

2.2,default和delete 

2.3,final与override

3,STL容器的一些变化

4,lambda 

4.1,lambda表达式的语法

4.2,捕捉列表 

5,包装器 

5.1,function

 5.2,bind


1,可变参数模板

1.1,基本语法及原理

  • C++11支持可变参数模板,也就是说支持可变数量参数的函数模板和类模板。可变数目的参数被称为参数包,存在两种参数包:模板参数包,表示零个或多个模板参数,函数参数包:表示零个或多个函数参数。

template <class...Args>

void Func(Args...args)

{}

template <class...Args>

void Func(Args&...args)

{}

template <class...Args>

void Func(Args&&...args)

{}

  • 我们用省略号来指出一个模板参数或函数参数的表示一个包, 在模板参数列表中,class...或 typename...指出接下来的参数表示零或多个类型列表;在函数参数列表中,类型名后面跟...指出 接下来表示零或多个形参对象列表;函数参数包可以用左值引用或右值引用表示,跟前面普通模板⼀样,每个参数实例化时遵循引用折叠规则。
  • 可变参数模板的原理跟模板类似,本质还是去实例化对应类型和个数的多个函数。

1.2,包扩展 

对于⼀个参数包,我们除了能计算他的参数个数,我们能做的唯一的事情就是扩展它,当扩展⼀个 包时,我们还要提供用于每个扩展元素的模式,扩展⼀个包就是将它分解为构成的元素,对每个元素应用模式,获得扩展后的列表。我们通过在模式的右边放⼀个省略号(...)来触发扩展操作。

void showlist()
{
    cout << endl;
}

template <class T,class...Args>
void showlist(T x, Args...args)
{
    cout << x << " ";
    showlist(args...);
}

template <class...Args>
void print(Args...args)
{
    //args是N个参数的参数包
    //调用showlist,参数包的第一个传给x
    //剩下N-1个传给第二个参数

    showlist(args...);
}

int main()
{
    print(1, string("xxxxxx"), 2.2);
    return 0;
}

4.3,emplace系列接口 

template <class...Args> void emplace_back (Args&&... args);

  •  C++11以后STL容器新增了empalce系列的接口,empalce系列的接口均为模板可变参数,功能上 兼容push和insert系列,,empalce还支持直接插入构造T对象的参数,这样有些场景会更高效一些,可以直接在容器空间上构造T对象。
  • emplace_back接口比insert和push_back接口更高效。

2,新的类功能

2.1,默认的移动构造和移动赋值

  • 原来C++类中,有6个默认成员函数:构造函数/析构函数/拷贝构造函数/拷贝赋值重载/取地址重 载/const 取地址重载,最后重要的是前4个,后两个⽤处不大,默认成员函数就是我们不写编译器 会⽣成⼀个默认的。C++11新增了两个默认成员函数,移动构造函数和移动赋值运算符重载,这两个函数在上篇文章中讲过。
  • 如果你没有自己实现移动构造函数,且没有实现析构函数、拷贝构造、拷贝赋值重载中的任意一个。那么编译器会自动生成一个默认移动构造。默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造,如果实现了就调用移动构造,没有实现就调用拷贝构造。
  • 默认移动赋值与上面的移动构造完全类似。
  • 如果你提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造和拷贝赋值。

class Person
{
public:
    Person(const char* name="张三", int age=1)
        :_name(name)
        ,_age(age)
    {}
private:
    string _name;
    int _age;
};

int main()
{
    Person s1;
    Person s2 = s1;
    Person s3 = move(s1);

    return 0;
}

s2调用默认拷贝构造。s3调用移动构造函数,对于string类型,内部实现了移动构造,就嗲用地洞构造。对于int内置类型,逐字节拷贝。 

2.2,default和delete 

default关键字:

作用:

显式要求编译器生成某个特殊成员函数的默认实现
适用于:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符。

 使用场景:
当类中定义了其他构造函数时,编译器可能不再自动生成默认构造函数。用default显式恢复:

class MyClass {
public:
    MyClass(int x) {}      // 自定义构造函数
    MyClass() = default;   // 显式生成默认构造函数
};

delete关键字

作用

显式禁用某个函数(包括成员函数和普通函数),阻止其被调用。

 使用场景:

1,禁止拷贝语义
禁用拷贝构造函数和拷贝赋值运算符,常见于资源管理类(如独占资源):

class NonCopyable {
public:
    NonCopyable() = default;
    NonCopyable(const NonCopyable&) = delete;            // 禁用拷贝构造
    NonCopyable& operator=(const NonCopyable&) = delete; // 禁用拷贝赋值
};

2禁用隐式类型转换
删除特定参数类型的重载函数,避免意外的隐式转换:

class MyClass {
public:
    void Process(int x) {}
    void Process(double) = delete; // 禁止double参数调用
};

MyClass obj;
obj.Process(10);     // OK
obj.Process(3.14);   // 编译错误:函数已删除

3,禁用不希望的函数
例如,禁止通过某些方式构造对象: 

class Singleton {
public:
    Singleton() = default;
    Singleton(const Singleton&) = delete; // 禁止拷贝
};

对比传统的实现方式:

 1,default vs 隐式生成

  • 显式声明意图更清晰,避免因代码修改导致默认函数被隐式删除。

2,delete vs 私有化函数(C++11前)

  • 旧方法:将函数声明为private且不实现,但错误在链接阶段才暴露。

  • C++11的delete在编译阶段直接报错,提供更清晰的错误信息。

2.3,final与override

final的作用:

  • 修饰类:防止类被继承。

class FinalClass final {
    // 类的内容
};

  • 修饰成员函数:防止成员函数在派生类中被覆盖。

class Base {
public:
    virtual void show() final {
        std::cout << "Base show" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() override { // 错误:Base::show是final的
        std::cout << "Derived show" << std::endl;
    }
};

override是一个成员函数的修饰符,用于显式地表示一个成员函数覆盖了基类中的虚函数。它主要用于方法重写。

class Base {
public:
    virtual void show() {
        std::cout << "Base show" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() override { // 显式声明覆盖
        std::cout << "Derived show" << std::endl;
    }
};

作用

  • 显式声明覆盖:当派生类中的成员函数覆盖了基类中的虚函数时,使用override可以显式地声明这种覆盖关系,增强代码的可读性和安全性。

  • 编译器检查:如果使用了override,但实际并没有覆盖基类中的虚函数(例如,方法签名不匹配),编译器会报错。

3,STL容器的一些变化

unordered_map和unordered_set的加入。右值引用和移动语义相关的push/insert/emplace系列 接口和移动构造和移动赋值,还有initializer_list版本的构造 等。

容器的范围for遍历

std::vector<int> vec = {1, 2, 3};
for (auto& num : vec) {
    std::cout << num << " ";
}

4,lambda 

4.1,lambda表达式的语法

  • lambda 表达式本质是⼀个匿名函数对象,跟普通函数不同的是他可以定义在函数内部。lambda 表达式语法使用层而言没有类型,所以我们一般是用auto或者模板参数定义的对象去接受lambda对象。
  • lambda表达式的格式: [capture-list] (parameters)-> return type {function body}
  • [capture-list] :捕捉列表,该列表总是出现在lambda 函数的开始位置 ,编译器根据 [] 来判断接下来的代码是否为lambda函数。捕捉列表能够捕捉上下文中的变量供 lambda 函数使用,捕捉列表可以传值和传引用捕捉。捕捉列表为空也不能省略。
  • (parameters):参数列表,与普通函数的参数列表功能类似,如果不需要参数传递,则可以省略()。
  • -> return type ::返回值类型,⽤追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。⼀般返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。
  • function body::函数体,函数体内的实现跟普通函数完全类似,在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

示例:

auto add1 = [](int x, int y)->int {return x + y; };

    auto func1 = []
        {
            cout << "hello world" << endl;
            return 0;
        };

auto swap1 = [](int& x, int& y)
    {
        int tmp = x;
        x = y;
        y = tmp;
    }; 

//sort的第三个参数可以传lambda表达式的比较函数

std::sort(vec.begin(), vec.end(), [](int a, int b) {
    return a > b; // Sort in descending order

});

4.2,捕捉列表 

  • lambda 表达式中默认只能用 lambda 函数体和参数中的变量,如果想用 外层作用域中的变量需要进行捕捉。
  • 第⼀种捕捉方式是在捕捉列表中显示的传值捕捉和传引用捕捉,捕捉的多个变量用逗号分割。[x,y,&z]表示x和y值捕捉,z引用捕捉。

int a = 0, b = 1, c = 2, d = 3;
//显示传值和传引用捕捉
auto func1 = [a, &b]
    {
        //值捕捉的变量不可以修改
        //引用捕捉的变量可以修改
        //a++;  报错

        b++;
        int ret = a + b;
        return ret;
    };
cout << func1() << endl;

    //传值捕捉本质是一种拷贝,并且被const修饰了,不能修改
    //mutable相当于去掉了const属性,可以修改了
    //但是内部修改不会影响外部的值,因为是一种拷贝

    auto func = [=]()mutable
        {
            a++;
            b++;
            c++;
            d++;
            return a + b + c + d;
        };
    cout << func() << endl;

  • 第二种捕捉方式是在捕捉列表中隐式捕捉,我们在捕捉列表写一个 = 表示隐式值捕捉,在捕捉列表 写一个 表示隐式引用捕捉,这样我们 lambda 表达式中用了那些变量,编译器就会自动捕捉那些变量。

//隐式值捕捉
//用了那些变量就捕捉那些变量

auto func2 = [=]
    {
        int ret = a + b + c;
        return ret;
    };
cout << func2() << endl;

//隐式引用捕捉
//用了那些变量就捕捉那些变量

auto func3 = [&]
    {
        a++;
        b++;
        c++;
    };
func3();
cout << a << " " << b << " " << c << " " << endl;

  • 第三种捕捉方式是在捕捉列表中混合使用隐式捕捉和显示捕捉。[=,&x]表示其他变量隐式值捕捉, x引用捕捉;[&,x,y]表示其他变量引用捕捉,x和y值捕捉。当使用混合捕捉时,第⼀个元素必须是 &或=,并且&混合捕捉时,后⾯的捕捉变量必须是值捕捉,同理=混合捕捉时,后⾯的捕捉变量必须是引用捕捉。

 //混合捕捉
    auto func4 = [&, a, b]
        {
            //a++  报错
            //b++  报错

            c++;
            d++;

            return a + b + c + d;
        };
    func4();
    cout << a << " " << b << " " << c << " " << endl;

    //混合捕捉
    auto func5 = [=, &a, &b]
        {
            a++;
            b++;
            //c++ 报错
            //d++ 报错

        };
    func5();

  • lambda 表达式如果在函数局部域中,他可以捕捉 lambda 位置之前定义的变量,不能捕捉静态 局部变量和全局变量,静态局部变量和全局变量也不需要捕捉。lambda 表达式中可以直接使用。这也意味着 lambda 表达式如果定义在全局位置,捕捉列表必须为空

//局部的静态和全局变量不能捕捉,不需要捕捉就可以用
static int m = 1;
static int n = 2;
auto func6 = [ ]
    {
        return m + n;
    };

5,包装器 

5.1,function

  • std::function 是⼀个类模板,也是⼀个包装器。std::function 的实例对象可以包装存储其他的可以调用对象,包括函数指针、仿函数、 lambda 、bind 表达式等,存储的可调用对象被称为std::function的目标。若std::function不含目标,则成称它为空。调用空std::function的目标导致抛出std::bad_function_call异常。 
  • 它被定义在<functiinal>头文件中 。
  • 函数指针,lambda,仿函数等可调用对象的类型各不相同。std::function的又是就是统一类型,对他们进行包装。

#include <functional>
#include <iostream>

int add(int a, int b) {
    return a + b;
}

struct Functor {
    int operator()(int a, int b) {
        return a + b;
    }
};

int main() {
    std::function<int(int, int)> f1 = add; // 包装普通函数
    std::function<int(int, int)> f2 = Functor(); // 包装仿函数
    std::function<int(int, int)> f3 = [](int a, int b) { return a + b; }; // 包装Lambda表达式

    std::cout << f1(1, 2) << std::endl; // 输出3
    std::cout << f2(1, 2) << std::endl; // 输出3
    std::cout << f3(1, 2) << std::endl; // 输出3
}

包装成员函数 

 class Plus
{
public:
    Plus(int n=1)
        :_n(n)
    {}

    static int plusi(int a, int b)
    {
        return a + b;
    }

    double plusd(double x, double y)
    {
        return (x + y) * 10;
    }
private:
    int _n;
};

int main()
{
    //包装静态成员函数  需要指明类域+&
    function<int(int, int)> f1 = &Plus::plusi;

    //包装非静态成员函数  需要指明类域+&  
    //非静态成员函数包含this指针

    function<double(Plus*, double, double)> f2 = &Plus::plusd;
    Plus pl;
    cout << f2(&pl, 1.1, 2.2) << endl;

    //下面的写法也可以
    function<double(Plus, double, double)> f3 = &Plus::plusd;
    function<double(Plus&, double, double)> f4 = &Plus::plusd;
    return 0;
}

 5.2,bind

  • bind 是⼀个函数模板, 对接受的可调用的对象 进行处理后返回一个可调用对象。bind 可以用来调整参数个数和参数顺序。bind 也在<function>这个头文件中。
  • 调⽤bind的一般形式: auto newCallable = bind(callable,arg_list); 其中 newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的callable的 参数。当我们调用newCallable时,newCallable会调用callable,并传给它arg_list中的参数。
  • arg_list中的参数可能包含形如_n的名字,其中n是⼀个整数,这些参数是占位符,表示 newCallable的参数,它们占据了传递给newCallable的参数的位置。数值n表示生成的可调⽤对象 中参数的位置:_1为newCallable的第⼀个参数,_2为第⼆个参数,以此类推。_1/_2/_3....这些占位符在placeholders的一个命名空间中。

总结:std::bind 是一个绑定器,用于将函数或可调用对象的参数绑定到特定的值上,从而创建一个新的可调用对象。它通常用于固定某些参数,使函数或可调用对象的调用更简单。 

 调整参数顺序示例:

using placeholders::_1;
using placeholders::_2;
using placeholders::_3;
int sub(int a, int b)
{
    return (a - b) * 10;
}
int main()
{
    auto sub1 = bind(sub, _1, _2);
    cout << sub1(10, 5) << endl;

    auto sub2 = bind(sub, _2, _1);
    cout << sub2(10, 5) << endl;

    return 0;
}

调整参数个数示例:

 int  subx(int a, int b, int c)
{
    return (a - b - c) * 10;
}

//绑死一些参数,达到修改参数个数的目的
//分别绑死第1,2,3个参数

auto sub3 = bind(subx, 100, _1, _2);  //a被绑死=100
cout << sub3(5, 1) << endl;

auto sub4 = bind(subx, _1, 100, _2);
cout << sub4(5, 1) << endl;

auto sub5 = bind(subx, _1, _2,100);
cout << sub5(5, 1) << endl;

在function部分,在包装一个类的非静态成员函数时,参数必须要传一个对象或者对象的地址,我们可以使用bind来绑定这个参数。

using placeholders::_1;
using placeholders::_2;
using placeholders::_3;

class Plus
{
public:
    Plus(int n=1)
        :_n(n)
    {}

    static int plusi(int a, int b)
    {
        return a + b;
    }

    double plusd(double x, double y)
    {
        return (x + y) * 10;
    }
private:
    int _n;
};

int main()
{
    //包装静态成员函数  需要指明类域+&
    function<int(int, int)> f1 = Plus::plusi;

    //包装非静态成员函数  需要指明类域+&  
    //非静态成员函数包含this指针

    function<double(Plus*, double, double)> f2 = &Plus::plusd;
    Plus pl;
    cout << f2(&pl, 1.1, 2.2) << endl;

    //绑定Plus()参数,传参时就不需要传了
    function<double(double, double)> f3 = bind(&Plus::plusd, Plus(), _1, _2);
    cout << f3(1.1, 2.2) << endl;
    return 0;
}

 C++11中的一个重要内容:智能指针,在一篇中更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966422.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TCP三次握手全方面详解

文章目录 (1) 三次握手各状态CLOSE状态SYN_SENT状态SYN_RECV状态ESTABLISHED状态 (2) 为什么握手时的seqnum是随机值&#xff0c;以及acknum的功能(3) 三次握手中的半连接队列&#xff08;SYN队列&#xff09;和全连接队列&#xff08;ACCEPT队列&#xff09;半连接队列全连接队…

模拟开发小鹅通首页网站练习

HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>小鹅通-首页</title><!-- 引入页…

认识O(NlogN)的排序

归并排序 归并排序&#xff08;任何一个递归&#xff09;如果不懂可以画一个树状结构去帮助自己去理解。 核心排序方法为Merger public class 归并排序 {public static void main(String[] args) {int[] arr1 {3, 1, 2, 2, 5, 6};int[] arr2 Arrays.copyOf(arr1, arr1.len…

Qt中的绘图设备:QPixmap、QImage 和 QPicture(详细图文教程_附代码)

&#x1f4aa; 图像算法工程师&#xff0c;专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &a…

w199疫情打卡健康评测系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

JAVA:Spring Boot 集成 Disruptor 的技术指南

1、简述 在高并发应用中&#xff0c;传统的队列机制如 BlockingQueue 在面对大量请求时容易成为系统瓶颈。而 LMAX Disruptor 是一个高效的无锁队列&#xff0c;适合用来构建高吞吐、低延迟的事件处理系统。本文将介绍如何在 Spring Boot 中集成 Disruptor&#xff0c;并列出详…

使用AI工具(Deepseek or 豆包etc)话业务流程图

①打开AI工具&#xff0c;这里以Deepseek为例子&#xff1a; Deepseek官网 ②输入所要画图的业务流程的文字。 &#xff08;这里以一个用户登录的流程的文字作为例子&#xff09; mermaid在线画图网页&#xff08;根据AI工具对应生成的画图代码&#xff09; ③把AI工具生成的…

自动化测试工具:selenium

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Selenium是一个用于Web应用程序测试的工具。是一个开源的Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;类型像我们玩游戏用的按键…

UIAbility 生命周期方法

生命周期流程图 UIAbility的生命周期官方文档地址https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/uiability-lifecycle-V13 1. onCreate(want: Want, launchParam: LaunchParam) 触发时机&#xff1a;Ability首次创建时 作用&#xff1a;初始化核心资源…

C语言:函数栈帧的创建和销毁

目录 1.什么是函数栈帧2.理解函数栈帧能解决什么问题3.函数栈帧的创建和销毁的过程解析3.1 什么是栈3.2 认识相关寄存器和汇编指令3.3 解析函数栈帧的创建和销毁过程3.3.1 准备环境3.3.2 函数的调用堆栈3.3.3 转到反汇编3.3.4 函数栈帧的创建和销毁 1.什么是函数栈帧 在写C语言…

开箱即用的.NET MAUI组件库 V-Control 发布了!

之前写过挺多的MAUI Sample&#xff0c;其中有很多代码可以打包成组件&#xff0c;当组件完善到一定程度&#xff0c;我会把控件封装起来放到控件库中。 今天&#xff0c;在这个仓库建立一年零八个月后&#xff0c;我觉得可以考虑将其作为开源库发布。 有很多网友在观望.NET …

Qt:项目文件解析

目录 QWidget基础项目文件解析 .pro文件解析 widget.h文件解析 widget.cpp文件解析 widget.ui文件解析 main.cpp文件解析 认识对象模型 窗口坐标系 QWidget基础项目文件解析 .pro文件解析 工程新建好之后&#xff0c;在工程目录列表中有⼀个后缀为 ".pro" …

装备库室管控系统|支持国产化、自主研发

装备库室管控系统&#xff08;DW-S306&#xff09;利用现有内部网络&#xff0c;部署综合管理系统&#xff0c;形成一套上下统一、功能完善的管理体系&#xff0c;建设一个功能完善、规范有序为目标&#xff0c;实现可视化监管、数字化军械管理、安全监管于一体的物联网信息化管…

软件测试就业

文章目录 2.6 初识一、软件测试理论二、软件的生产过程三、软件测试概述四、软件测试目的五、软件开发与软件测试的区别&#xff1f;六、学习内容 2.7 理解一、软件测试的定义二、软件测试的生命周期三、软件测试的原则四、软件测试分类五、软件的开发与测试模型1.软件开发模型…

【Java基础】序列化、反序列化和不可变类

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Java基础面经 &#x1f4da;本系列文章为个…

upx压缩工具使用说明

UPX&#xff08;Ultimate Packer for Executables&#xff09;是一款开源的可执行文件打包工具&#xff0c;能够将可执行文件&#xff08;如Windows的.exe文件或Linux的ELF文件&#xff09;进行压缩&#xff0c;以减少文件大小&#xff0c;并增加反逆向工程的难度。 下载相关安…

DeepSeek-R1 32B Windows+docker本地部署

最近国产大模型DeepSeek兴起&#xff0c;本地部署了一套deepseek同时集成Open WebUI界面,给大家出一期教程。 软件&#xff1a;Ollama、docker、Open WebUI 一、用Ollama下载模型 首先我们需要安装Ollama&#xff0c;它可以在本地运行和管理大模型。 到Ollama官网 https://ol…

活动预告 |【Part 2】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动&#xff0c;了解如何更好地在 Microsoft 365 Defen…

(2024|CVPR,MLLM 幻觉)OPERA:通过过度信任惩罚和回顾分配缓解多模态大型语言模型中的幻觉

OPERA: Alleviating Hallucination in Multi-Modal Large Language Models via Over-Trust Penalty and Retrospection-Allocation 目录 1. 引言 2. 相关研究 2.1 多模态大语言模型 2.2 LLM 的幻觉与解决方案 2.3. 语言模型中的解码策略 3. 方法 3.1 MLLM 生成过程 3.2…

激活函数篇 03 —— ReLU、LeakyReLU、ELU

本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归&#xff1a;Sigmoid函数在分类问题中的应用 整流线性单位函数&#xff08;Rectified Linear Unit, ReLU&#xff09;&#xff0c;又称修正线性单元&a…