当前位置: 首页 > news >正文

【C++】C++新增特性解析:Lambda表达式、包装器与绑定的应用

在这里插入图片描述

V可变参数模板与emplace系列

C++语法相关知识点可以通过点击以下链接进行学习一起加油!
命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇
类和对象-下篇日期类C/C++内存管理模板初阶String使用
String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriority Queue与仿函数
模板进阶-模板特化面向对象三大特性-继承机制面向对象三大特性-多态机制STL 树形结构容器二叉搜索树
AVL树红黑树红黑树封装map/set哈希-开篇闭散列-模拟实现哈希
哈希桶-模拟实现哈希哈希表封装 unordered_map 和 unordered_setC++11 新特性:序章右值引用、移动语义、万能引用实现完美转发可变参数模板与emplace系列

大家好,我是店小二。在这篇文章中,我们将深入探讨C++11的新特性——Lambda表达式、包装器与绑定的应用。如果在阅读过程中有不清楚的地方或发现任何错误,欢迎随时私信交流探讨。

请添加图片描述
Alt
🌈个人主页:是店小二呀
🌈C语言专栏:C语言
🌈C++专栏: C++
🌈初阶数据结构专栏: 初阶数据结构
🌈高阶数据结构专栏: 高阶数据结构
🌈Linux专栏: Linux

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 请添加图片描述

文章目录

  • 一、lambda表达式
    • 1.1 lambda表达式说明
    • 1.2 可省略部分
    • 1.3 lambda使用场景(个人推荐使用第二种)
    • 1.4 比较lambda和仿函数
    • 1.5 lambda类型
      • 1.5.1 未定义类型
      • 1.5.2 定义类型
    • 1.6 捕获列表
      • 1.6.1 捕获列表说明
      • 1.6.2 什么情况下捕捉列表必须为空?
      • 1.6.3 传值捕捉
      • 1.6.4 mutable可以修改拷贝对象
      • 1.6.5 引用捕获
      • 1.6.6 传值捕捉所有对象
      • 1.6.7 传引用捕捉所有对象
      • 1.6.8 混合捕捉
    • 1.7 函数对象与lambda表达式
  • 二、包装器
    • 1.1 function包装器
    • 1.2 function使用场景(对上面的修改)
  • 三、bind绑定
    • 3.1 bind概念
    • 3.2 placeholders

一、lambda表达式

在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法 。

struct Goods
{string _name;double _price;int _evaluate;Goods(const char* str, double price, int evaluate):_name(str),_price(price),_evaluate(evaluate){}
};struct ComparePriceLess
{bool operator()(const Goods& gl, const Goods& gr){return gl._price < gr._price;}
};
struct ComparePriceGreater
{bool operator()(const Goods& gl, const Goods& gr){return gl._price > gr._price;}
};
int main()
{vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2,3 }, { "菠萝", 1.5, 4 } };sort(v.begin(), v.end(), ComparePriceLess());sort(v.begin(), v.end(), ComparePriceGreater());
}

随着C++语法的发展,上面的写法过于复杂,每次为了实现一个algorithm算法,都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。因此,在C++11语法中出现了Lambda表达式 (本质也是匿名对象调用仿函数)

1.1 lambda表达式说明

lambda表达式书写格式:[capture-list] (parameters) mutable -> return-type { statement }

lambda表达式各部分说明:

  • [capture-list] 捕捉列表:该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用
  • **(parameters)参数列表:**与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略
  • mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空) (这个一般可以省略)
  • ->returntype返回值类型:用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导
  • {statement}函数体:在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

1.2 可省略部分

在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空。

因此C++11中最简单的lambda函数为:[]{}表示lambda函数不能做任何事情

lambda表达式实际上可以理解为无名函数,该函数无法直接被调用,如果想要直接调用,可借助auto将其赋值给一个变量。

int main()
{//lambdaauto add1 = [](int a, int b)->int {return a + b; };//返回值 可以省略auto add2 = [](int a, int b) {return a + b; };//没有参数,参数列表可以省略auto func1 = [] {cout << "hello world" << endl; };//调用lambda匿名函数cout << add1(1, 2) << endl;func1();return 0;
}

1.3 lambda使用场景(个人推荐使用第二种)

在这里插入图片描述

//第一种
auto ComparePriceGreater = [](const Goods& gl, const Goods& gr) { return gl._price > gr._price;});
sort(v.begin(), v.end(),ComparePriceGreater);//第二种
sort(v.begin(), v.end(), [](const Goods& gl, const Goods& gr) { return gl._price > gr._price;});

1.4 比较lambda和仿函数

  • 功能:仿函数和 Lambda 表达式都能重新定义函数调用的行为,但是 Lambda 表达式更加灵活和直观,特别是在需要定义简短、一次性的函数时非常方便
  • 语法:Lambda 表达式的语法更为紧凑,使得代码更易于阅读和维护,而仿函数则更适合于需要长期保存状态或多次调用的情况。
  • 使用场景:在现代 C++ 中,Lambda 表达式通常更受欢迎,因为它们简洁明了,且能够直接在需要时定义和使用,避免了定义额外的类或结构体。

上述代码就是使用C++11中lambda表达式来解决,可以看出lambda表达式实际是一个匿名函数。既然是匿名函数lambda的类型也是不得而知的,但是我们可以通过cout << typeid().name << endl;参考下类型

1.5 lambda类型

Lambda 表达式在 C++ 中的类型可以有两种主要形式:*未命名类型和命名类型

1.5.1 未定义类型

当 Lambda 表达式没有被赋予一个变量或者没有作为参数传递给一个模板时,它们是未命名的,也就是没有特定的类型,对象的行为是函数体和函数参数决定的未命名类型的 Lambda 表达式auto lambda = [](int x){return x * 2;};

在这里插入图片描述

1.5.2 定义类型

当 Lambda 表达式被赋予一个变量或者被用作模板参数时,它们可以有一个具体的类型命名类型的 Lambda 表达式:std::function<int(int)> lambda = [](int x) { return x * 2; };

在这里插入图片描述

lambda原理类似范围for。lambda编译时,编译器会生成对应仿函数的名称,对此lambda本质还是仿函数

在这里插入图片描述

1.6 捕获列表

1.6.1 捕获列表说明

捕捉列表描述了上下文中那些数据可以被lambda使用,以及使用的方式传值还是传引用。:

  • [var]:表示值传递方式捕捉变量var
  • [=]:表示值传递方式捕获所有父作用域中的变量(包括this)
  • [&var]:表示引用传递捕捉变量var
  • [&]:表示引用传递捕捉所有父作用域中的变量(包括this)
  • [this]:表示值传递方式捕捉当前的this指针

捕获列表注意:

  1. 父作用域指包含lambda函数的语句块
  2. 语法上捕捉列表可由多个捕捉项组成,并以逗号分割。比如:[=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量[&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量
  3. 捕捉列表不允许变量重复传递,否则就会导致编译错误。比如:[=, a]:=已经以值传递方式捕捉了所有变量,捕捉a重复
  4. 在块作用域以外的lambda函数捕捉列表必须为空。
  5. 在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或者非局部变量都会导致编译报错
  6. lambda表达式之间不能相互赋值,即使看起来类型相同

1.6.2 什么情况下捕捉列表必须为空?

如果一个lambda函数被定义在某个块作用域内,而它试图在这个块作用域外部(即在这个块结束后)使用,这时这个lambda函数的捕捉列表必须为空。原因是:

  • 捕捉的变量作用域有限:在块作用域结束后,块作用域内的局部变量将不再存在。如果lambda函数捕捉了这些变量,并在块外部被调用,这会导致未定义行为,因为那些变量已经销毁了。
  • 捕捉列表为空:意味着lambda函数不依赖于块作用域中的任何局部变量,这样lambda函数就可以在块作用域结束后安全地使用。

块作用域:这是一个局部作用域,通常指在花括号 {} 中的代码块,比如函数体或循环体。

以上是相关捕获列表的相关知识,以下将通过代码进行分析,深入理解使用。

1.6.3 传值捕捉

第一种:捕获a,b对象给lambda,但是不可以修改捕获对象,因为这里捕获a,b对象是对外面域a,b对象的拷贝,临时对象具有常性

int main()
{int a = 10, b = 20;cout << "a: " << a << "   " << "b: " << b << endl;auto swap = [a, b]() {int tmp = a;a = b;b = tmp;};swap();cout << "a: " << a << "   " << "b: " << b << endl;return 0;
}

在这里插入图片描述

1.6.4 mutable可以修改拷贝对象

mutable可以修改传值捕捉对象(日常一般不需要),因为这里捕获a,b对象是对外面域a,b对象的拷贝,虽然修改也不改变外面的a b。

int main()
{int a = 10, b = 20;cout << "a: " << a << "   " << "b: " << b << endl;auto swap = [a, b]() mutable{int tmp = a;a = b;b = tmp;};swap();cout << "a: " << a << "   " << "b: " << b << endl;return 0;
}

在这里插入图片描述

1.6.5 引用捕获

int main()
{int a = 10, b = 20;cout << "a: " << a << "   " << "b: " << b << endl;auto swap = [&a,&b]() {int tmp = a;a = b;b = tmp;};swap();cout << "a: " << a << "   " << "b: " << b << endl;return 0;
}

在这里插入图片描述

1.6.6 传值捕捉所有对象

int main()
{int a = 1, b = 2, c = 3, d = 4, e = 5;// 传值捕捉所有对象auto func1 = [=](){return a + b + c * d;};cout << func1() << endl;return 0;
}

1.6.7 传引用捕捉所有对象

int main()
{int a = 1, b = 2, c = 3, d = 4, e = 5;auto func = [&](){a++;b++;c++;d++;e++;};func();cout << a << b << c << d << e << endl;return 0;
}

1.6.8 混合捕捉

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

以上虽然有什么传值捕获、引用捕获、混合捕获,其实只要调用函数传值感觉差不多,这里重点是掌握用法就行了

1.7 函数对象与lambda表达式

函数对象又称为仿函数,即可以想函数一样使用的对象,就是在类中重载了operator()运算符的类对象

class Rate
{
public:Rate(double rate) : _rate(rate){}double operator()(double money, int year){return money * _rate * year;}
private:double _rate;
};
int main()
{// 函数对象double rate = 0.49;Rate r1(rate);r1(10000, 2);// lamberauto r2 = [=](double monty, int year)->double {return monty * rate * year;};r2(10000, 2);return 0;
}

从使用方式上来看,函数对象与lambda表达式完全一样,函数对象将rate作为其成员变量,在定义对象时给出初始值即可,lambda表达式通过捕获列表可以直接将该变量捕获到。

在这里插入图片描述

实际在底层编译器对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的,即:如果定义了一个lambda表达式,编译器会自动生成一个类,在该类中重载了operator()

二、包装器

//可调用对象  -- 使用了模板
template <class F, class T>T useF(F f, T x)
{static int count = 0;cout << "count:" << ++count << endl;cout << "count:" << &count << endl;return f(x);
};double f(double i)
{return  i / 2;}struct Functor
{double operator()(double d){return d / 3;}
};int main()
{//函数名cout << useF(f, 11.11) << endl;//函数对象(这里是匿名对象)cout << useF(Functor(), 11.11) << endl;//lambda表达式(利用模板)cout << useF([](double d)->double {return d / 4; }, 11.11) << endl;return 0;
}

通过模板根据不同的类型可以调用不同的可调用对象,比如函数指针、仿函数对象、lambda,如此繁多的选择也可能会导致模板效率低下。通过上面的程序验证,这里useF函数模板实例化了三份,而且对于不同的可调用对象也有存在于自己的缺点和优点,这里就需要包装器进行统一下了。

可调用对象优缺点分析:

  • 函数指针 --> 类型定义复杂
  • 仿函数对象 --> 要定义一个类,用的时候有点麻烦,不适合统一类型
  • lambda --> 没有类型概念(类型对我们没有用)

在这里插入图片描述

1.1 function包装器

function包装器也叫作适配器C++中的function本质是一个类模板,也是一个包装器。std::function在头文件。

function类模板原型

template <class T>  function; // undefindtemplate <class Ret, class... Args>
class function<Ret(Args...)>;模板参数说明:Ret : 被调用函数的返回类型Args…:被调用函数的形参

function不是定义可调用对象,而是包装可调用对象

function<int(int,int)> fc1;↑      ↑返回值类型  形参类型列表

1.2 function使用场景(对上面的修改)

#include <functional>
template<class F, class T>T useF(F f, T x)
{static int count = 0;cout << "count:" << ++count << endl;cout << "count:" << &count << endl;return f(x);
}
double f(double i)
{return i / 2;
}
struct Functor
{double operator()(double d){return d / 3;}
};
int main()
{// 函数名std::function<double(double)> func1 = f;cout << useF(func1, 11.11) << endl;// 函数对象std::function<double(double)> func2 = Functor();cout << useF(func2, 11.11) << endl;// lamber表达式std::function<double(double)> func3 = [](double d)->double { return d / 4; };cout << useF(func3, 11.11) << endl;return 0;
}

通过以上代码,可以更好地去了解包装可调用对象,达到统一的作用。不妨在看一个场景。

在这里插入图片描述

主要是看红色框起来的地方跟左边代码对比,其实逻辑是大致相同,如果遇到操作符进行对应的运算,左边是通过switch分支语句实现,右边则是通过map的kv模型,将对于运算符(这里是字符)和包装器联系在一起,而包装器是对可调用对象进行包装,保证了不同的操作符对应不同仿函数的逻辑。然后下面返回仿函数直接调用就行了。将可调用函数跟数值联系起来并且存储在map类中。

三、bind绑定

3.1 bind概念

std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。

一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺序调整等操作

// 原型如下:
template <class Fn, class... Args>
/* unspecified */ bind(Fn&& fn, Args&&... args);// with return type (2)
template <class Ret, class Fn, class... Args>
/* unspecified */ bind(Fn&& fn, Args&&... args);

可以将bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来"适应"原对象的参数列表

调用bind的一般形式:auto newCallable ==bind(callable,arg_list);

参数部分:

  1. newCallable本身是一个可调用对象
  2. arg_list是一个逗号分隔的参数列表,对应给定的callable的参数

当我们调用newCallable时,neweCallable会调用callable,并传给它arg_list中的参数。

3.2 placeholders

在这里插入图片描述

arg_list中的参数可能包含形如_n的名字,其中n是一个整数,这些参数是"占位符",表示newCallable的参数的"位置"。数值n表示n生成的可调用对象中参数的位置: _1未newCallable的第一个参数, _2为第二个参数。以此类推。

在这里插入图片描述

std::placeholders::_1std::placeholders::_2 等是 C++11 标准引入的占位符,用于绑定函数对象时表示参数的位置。它们依次表示函数的第一个、第二个、第三个参数,以此类推。

在这里插入图片描述

std::bind 这里绑定了 fx 函数的第一个参数 s 为字符串 name(即“王昭君”),并将第二个参数和第三个参数的位置分别用 _1_2 来占位。这意味着生成的 f 是一个新的可调用对象,它接受两个参数,分别用于 fx 的第二个参数 x 和第三个参数 y

std::placeholders::_1_2 指定了新函数对象 f 的参数传递到原函数 fx 的对应位置,分别表示第二个和第三个参数位置。


在这里插入图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二呀C++笔记,希望对你在学习C++语言旅途中有所帮助!

相关文章:

【C++】C++新增特性解析:Lambda表达式、包装器与绑定的应用

V可变参数模板与emplace系列 C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现…...

python学opencv|读取图像

【1】引言 前序学习了使用matplotlib模块进行画图&#xff0c;今天开始我们逐步尝试探索使用opencv来处理图片。 【2】学习资源 官网的学习链接如下&#xff1a; OpenCV: Getting Started with Images 不过读起来是英文版&#xff0c;可能略有难度&#xff0c;所以另推荐一…...

租辆酷车小程序开发(二)—— 接入微服务GRPC

vscode中golang的配置 设置依赖管理 go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct GO111MODULEauto 在$GOPATH/src 外面且根目录有go.mod 文件时&#xff0c;开启模块支持 GO111MODULEoff 无模块支持&#xff0c;go会从GOPATH 和 vendor 文件夹寻找包…...

leetcode 208. 实现 Trie (前缀树)

Trie&#xff08;发音类似 "try"&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补全和拼写检查。 请你实现 Trie 类&#xff1a; Trie() 初始化前缀树对象…...

kafka进阶_3.消费消息

文章目录 一、消费消息概览1.1、消费示例代码1.2、消费过程 二、消费者组2.1、push & pull2.2、消费者组 三、调度器Coordinator四、消费者分配策略4.1、引言4.2、分配基本流程4.3、分配策略4.3.1、轮询分配策略4.3.2、轮询分配策略 五、消费偏移量5.1、起始偏移量5.2、指定…...

预测未来 | MATLAB实现Transformer时间序列预测未来

预测未来 | MATLAB实现Transformer时间序列预测未来 预测效果 基本介绍 1.Matlab实现Transformer时间序列预测未来&#xff1b; 2.运行环境Matlab2023b及以上&#xff0c;data为数据集&#xff0c;单变量时间序列预测&#xff1b; 3.递归预测未来数据&#xff0c;可以控制预…...

VirtualBox7.0.6安装配置

VirtualBox7.0.6安装配置 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 文章目录 VirtualBox7.0.6安装配置1.安装虚拟机1.1安装虚拟机的必要条件1.1.1开启虚拟化1.1.1.1检查虚拟化是否开启1.1.1.2 开启虚拟化 1.2 安装虚拟机1.1创建…...

Spring Boot英语知识分享网站:技术与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…...

HarmonyOS4+NEXT星河版入门与项目实战(22)------动画(属性动画与显示动画)

文章目录 1、属性动画图解2、案例实现-小鱼移动游戏1、代码实现2、代码解释3、资源图片4、实现效果3、显示动画4、案例修改-显示动画5、总结1、属性动画图解 这里我们用一张完整的图来汇整属性动画的用法格式和使用的主要属性范围,如下所示: 2、案例实现-小鱼移动游戏 1、代…...

AI赋能公共服务转型升级 | 第十届中国行业互联网大会暨腾讯云TVP行业大使三周年庆典公共服务专场圆满举办!

引言 党的二十大报告把“基本公共服务实现均等化”作为 2035 年我国发展的总体目标之一&#xff0c;强调要“健全基本公共服务体系&#xff0c;提高公共服务水平”。AI 作为新质生产力的核心驱动力之一&#xff0c;正在公共服务领域发挥着越来越重要的作用。 2024 年 10 月 2…...

网络基础 - 地址篇

一、IP 地址 IP 协议有两个版本&#xff0c;IPv4 和 IPv6IP 地址(IPv4 地址)是一个 4 字节&#xff0c;32 位的正整数&#xff0c;通常使用 “点分十进制” 的字符串进行表示&#xff0c;例如 192.168.0.1&#xff0c;用点分割的每一个数字表示一个字节&#xff0c;范围是 0 ~…...

chrome允许http网站打开摄像头和麦克风

第一步 chrome://flags/#unsafely-treat-insecure-origin-as-secure 第二步 填入网址&#xff0c;点击启用 第三步 重启 Chrome&#xff1a;设置完成后&#xff0c;点击页面底部的 “Relaunch” 按钮&#xff0c;重新启动 Chrome 浏览器&#xff0c;使更改生效。...

uniapp前端开发,基于vue3,element plus组件库,以及axios通讯

简介 UniApp 是一个基于 Vue.js 的跨平台开发框架&#xff0c;旨在通过一次开发、编译后运行在多个平台上&#xff0c;如 iOS、Android、H5、以及小程序&#xff08;微信小程序、支付宝小程序、百度小程序等&#xff09;等。UniApp 为开发者提供了统一的开发体验&#xff0c;使…...

STM32-- 串口发送数据

while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)RESET);&#xff1f;&#xff1f; 答&#xff1a; 这行代码&#xff1a; while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) RESET);的作用是等待串口 USART2 的发送数据寄存器&#xff08;TXE&#xff0c;Transmit Dat…...

网络安全提示

如果您是企业主或 IT 经理&#xff0c;您应该知道计算机安全的重要性。从保护密码安全的基础知识到网络钓鱼、恶意软件等的危险&#xff0c;本文将为您提供您需要了解的有关网络安全的信息。 每年&#xff0c;互联网都变得越来越大&#xff0c;这意味着我们为黑客和网络犯罪分…...

【计算机网络】多路转接之epoll

epoll也是一种linux中的多路转接方案(epoll也是只负责IO过程中的"等") 一、epoll相关接口的使用 1.epoll_create int epoll_create(int size); ​功能&#xff1a;创建一个epoll模型 ① int size&#xff1a;没意义了 >0就行 返回值&#xff1a;返回一个文件…...

nextjs+nestjs+prisma写todolist全栈项目

技术栈 nextjsnestjsprisma所学知识 Nextjs组件渲染,状态,路由docker启动Mysql容器prisma操作Mysql(CRUD)允许跨域请求APITanStack Query异步状态管理fetch api服务器组件预请求数据nestjs 管道和异常处理检测id是否正整数Docker启动Mysql容器 compose.yml name: todoLis…...

重构代码之将双向关联改为单向关联

在代码重构中&#xff0c;双向关联改为单向关联是指将原本双向关联转变为单向关联。这种重构方式有助于简化对象模型和提高代码的可维护性&#xff0c;减少不必要的耦合。下面是对这个重构技巧的详细讲解。 一、为什么需要将双向关联改为单向关联&#xff1f; 减少耦合&#…...

Linux介绍与安装指南:从入门到精通

1. Linux简介 1.1 什么是Linux&#xff1f; Linux是一种基于Unix的操作系统&#xff0c;由Linus Torvalds于1991年首次发布。Linux的核心&#xff08;Kernel&#xff09;是开源的&#xff0c;允许任何人自由使用、修改和分发。Linux操作系统通常包括Linux内核、GNU工具集、图…...

深度学习中的正则化模型是什么意思?

一、定义 在深度学习中&#xff0c;正则化是一种用于防止过拟合的技术。过拟合是指模型在训练数据上表现非常好&#xff0c;但在新的、未见过的数据&#xff08;测试数据&#xff09;上表现很差的情况。正则化模型就是通过在损失函数中添加额外的项来约束模型的复杂度&#xf…...

rabbitMq两种消费应答失败处理方式

在rabbitMq消费端&#xff0c;有三种应答模式&#xff1a; none&#xff1a;不处理。即消息投递给消费者后立刻 ack 消息会立刻从MQ删除。非常不安全&#xff0c;不建议使用 manual&#xff1a;手动模式。需要自己在业务代码中调用api&#xff0c;发送 ack 或 reject&#xff…...

windows C#-使用反射访问特性

你可以定义自定义特性并将其放入源代码中这一事实&#xff0c;在没有检索该信息并对其进行操作的方法的情况下将没有任何价值。 通过使用反射&#xff0c;可以检索通过自定义特性定义的信息。 主要方法是 GetCustomAttributes&#xff0c;它返回对象数组&#xff0c;这些对象在…...

java中链表的数据结构的理解

在 Java 中&#xff0c;链表是一种常见的数据结构&#xff0c;可以通过类的方式实现自定义链表。以下是关于 Java 中链表的数据结构和实现方式的详细介绍。 1. 自定义链表结构 Java 中链表通常由一个节点类 (ListNode) 和可能的链表操作类构成。 节点类 (ListNode) 这是链表…...

ctfshow

1,web153 大小写绕过失败 使用.user.ini 来构造后⻔ php.ini是php的⼀个全局配置⽂件&#xff0c;对整个web服务起作⽤&#xff1b;⽽.user.ini和.htaccess⼀样是⽬录的配置⽂件&#xff0c;.user.ini就是⽤户⾃定义的⼀个php.ini&#xff0c;我们可以利⽤这个⽂件来构造后⻔和…...

【AI绘画】Midjourney进阶:色调详解(下)

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;Midjourney中的色彩控制为什么要控制色彩&#xff1f;为什么要在Midjourney中控制色彩&#xff1f; &#x1f4af;色调纯色调灰色调暗色调 &#x1f4af…...

lanqiaoOJ 3747:繁忙的精神疗养院 ← STL queue

【题目来源】https://www.lanqiao.cn/problems/3747/learning/【题目描述】 心灵之园是一家知名的精神疗养院&#xff0c;为了提供更优质的服务&#xff0c;他们专门设立了一个 VIP 诊室和一个普通诊室。VIP 诊室主要接待特殊需求的高级会员&#xff0c;而普通诊室则服务所有的…...

Local Changes不展示,DevEco Studio的git窗口中没有Local Changes

DevEco Studio的git窗口中&#xff0c;没有Local Changes&#xff0c;怎么设置可以调出&#xff1f; 进入File-->Settings-->Version Control&#xff0c;将Use non-modal commit interface前的勾选框取消勾选&#xff0c;点击OK即可在打开git窗口&#xff0c;就可以看到…...

探索Python项目模板化的新纪元 —— Copier库揭秘

文章目录 **探索Python项目模板化的新纪元 —— Copier库揭秘**1. 背景介绍&#xff1a;为何Copier成为Python开发者的新宠&#xff1f;2. Copier究竟是什么&#xff1f;3. 如何安装Copier&#xff1f;4. 简单库函数使用方法创建模板从Git URL创建项目使用快捷方式动态文件生成…...

导入100道注会cpa题的方法,导入试题,自己刷题

一、问题描述 复习备考的小伙伴们&#xff0c;往往希望能够利用零碎的时间和手上的试题&#xff0c;来复习和备考 用一个能够导入自己试题的刷题工具&#xff0c;既能加强练习又能利用好零碎时间&#xff0c;是一个不错的解决方案 目前市面上刷题工具存下这些问题 1、要收费…...

使用NAS开启无纸化办公,Docker部署开源文档管理系统『Paperless-ngx』

使用NAS开启无纸化办公&#xff0c;Docker部署开源文档管理系统『Paperless-ngx』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于文案类的办公场景来说&#xff0c;手头堆放最多的可能就是各种文档文件&#xff0c;以及各种用过的打印废纸。 这么多年来&#xff0c;不管是领…...

docker安装mysql

1.拉取mysql镜像 docker pull mysql:5.7 2.启动mysql容器 docker run -d -e MYSQL_ROOT_PASSWORD123456 -e MYSQL_TCP_PORT3307 -p 3307:3307 -v /SDXL/wjz/docker_mysql_log:/var/log/mysql -v /SDXL/wjz/docker_mysql_data:/var/lib/mysql -v /SDXL/wjz/docker_mysql_conf:/e…...

9、深入剖析PyTorch的nn.Sequential及ModuleList源码

文章目录 1. train&eval2. 求导数3. 参数更新4. ModuleList,Sequential5. Parameter&Parameter_List&ParmeterDict 1. train&eval train 模式&#xff1a;表示的是神经网络的训练模式&#xff0c;能够进行样本学习&#xff0c;通过样本来更新权重weighteval 模…...

idea初始化设置

下载idea&#xff1a; https://www.jetbrains.com/idea/ 安装idea 安装插件&#xff1a; Rainbow BracketsLombokMybatisXSonarLintMaven HelperCodeGeeX&#xff08;国内AI插件可用&#xff09; 设置idea注释模板&#xff1a; 设置代码注释模板&#xff1a; https://blo…...

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录 更多文章C/C中的传统内存管理方式new和delete运算符malloc和free函数传统内存管理的弊端 智能指针的崛起智能指针的定义与作用C11引入的标准智能指针 详解C标准智能指针std::unique_ptr特点使用方法适用场景 std::shared_ptr特点使用方法适用场景 std::weak_ptr特点使…...

Vue.Draggable使用nested-with-vmodel进行拖拽

Vue.Draggable使用nested-with-vmodel进行拖拽 1. 介绍 ‌draggable‌是一个基于Sortable.js的Vue组件&#xff0c;用于实现拖拽功能。它支持触摸设备、拖拽和选择文本、智能滚动、不同列表之间的拖拽等功能&#xff0c;并且与Vue的视图模型同步刷新&#xff0c;兼容Vue2的过…...

MySQL 中的乐观锁与悲观锁

文章目录 MySQL 中的乐观锁与悲观锁一、引言二、乐观锁&#xff08;一&#xff09;原理&#xff08;二&#xff09;应用场景&#xff08;三&#xff09;示例代码 三、悲观锁&#xff08;一&#xff09;原理&#xff08;二&#xff09;应用场景&#xff08;三&#xff09;示例代…...

面试题分享(一)

实习的项目 成员规模 用到过哪些设计模式&#xff1f; 策略、单例、工厂、代理 责任链模式了解吗&#xff1f; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;目的是为了避免请求的发送者与接收者之间的耦合关系。通…...

用天翼云搭建一个HivisionIDPhoto证件照处理网站

世人不必记我&#xff0c;我不记世人。 HivisionIDPhoto证件照处理网站 世人不必记我&#xff0c;我不记世人。项目地址项目搭建与修改前端后端遇到的坑 成果图 前段时间工作需要频繁处理证件照&#xff0c;当时同事推荐一个证件照小程序&#xff08;要看广告&#xff09;&…...

Conda环境迁移到内网

文章目录 一、conda是什么&#xff1f; conda环境迁移 二、迁移方法 1.docker方式 2.conda包方式 3.conda指定目录创建环境 4.pip方式 5.单个包安装 总结 前言 搞Python&#xff0c;使用conda是避免不了的&#xff0c;利用conda可以方便的管理多个不同的虚拟环境&…...

React Hooks中use的细节

文档 useState useState如果是以函数作为参数&#xff0c;那要求是一个纯函数&#xff0c;不接受任何参数&#xff0c;同时需要一个任意类型的返回值作为初始值。 useState可以传入任何类型的参数作为初始值&#xff0c;当以一个函数作为参数进行传入的时候需要注意&#xff…...

Android 16 开发者预览版抢先使用

Android 16 开发者预览版 获取 Android 16在 Google Pixel 设备上获取 Android 16设置 Android 模拟器 设置 Android 16 SDK获取 Android Studio安装 SDK更新应用的 build 配置 获取 Android 16 你可以通过以下任一方式获取 Android 16 在 Google Pixel 设备上获取 Android 1…...

蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、组合数问题:::非常典型的必刷例题!!!)

下将以括号序列、组合数问题超级吧难的题为例子讲解动态规划 别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01;! ! ! ! &#xff01; 关注博主&#xff0c;更多蓝桥杯nice题目静待更新:) 动态规划 一、数字三角形 【问题描述】 上图给出了…...

c#:winform引入bartender

1、vs新建项目 ①选择Windows窗体应用&#xff08;.NET Framework&#xff09; 2、将bartender引入vs中 ①找到bartender的安装目录&#xff0c;复制Seagull.BarTender.Print.dll文件 ②粘贴到项目->bin->Debug文件&#xff0c;并可创建Model文件夹&#xff1a;为了存放…...

Zabbix 模板翻译自动化教程

在企业 IT 运维管理中&#xff0c;Zabbix 作为一款强大的开源监控平台被广泛应用。而 Zabbix 模板作为监控配置的重要组成部分&#xff0c;用来定义监控项、触发器、图形等。随着国际化的需求增加&#xff0c;Zabbix 模板的翻译工作变得日益重要&#xff0c;特别是在需要为不同…...

HarmonyOS开发:DevEco Studio的Beta3(5.0.5.200)新增和增强特性

新增特性 DevEco Studio支持开发API 13工程。DevEco Profiler Frame模板新增Lost Frames和Hitch Time泳道&#xff0c;用于识别和优化卡顿和丢帧现象。具体请参考Frame分析。hvigor-config.json5中properties下新增ohos.arkCompile.noEmitJs字段&#xff0c;用于指定ArkTS编译…...

macOS安装nvm node

macOS安装nvm macOS安装nvm创建 nvm 工作目录配置环境变量使用 nvm查看可用的 Node.js 版本安装特定版本 macOS安装nvm brew install nvm创建 nvm 工作目录 mkdir ~/.nvm配置环境变量 vim ~/.zshrc# nvm export NVM_DIR"$HOME/.nvm" [ -s "/opt/homebrew/opt…...

SpringBoot 集成MQTT实现消息订阅

1、引入依赖 <!--MQTT start--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId></dependency><dependency><groupId>org.springframework.integrat…...

VM+Ubuntu18.04+XSHELL+VSCode环境配置

前段时间换了新电脑&#xff0c;准备安装Linux学习环境&#xff1a;VM虚拟机、Ubuntu18.04操作系统、XSHELL、XFTP远程连接软件、VSCode编辑器等&#xff0c;打算把安装过程记录一下。 1. 虚拟机介绍 为什么要用虚拟机&#xff1f; 想学习Linux操作系统&#xff0c;一般有3种…...

C#上机练习66-70

66.数组x中存有20个四位整数&#xff0c;请编制函数&#xff0c;求出正整数的个数tn。以及各位数字之和是偶数的数的个数tc,以及满足条件的这些数的算术平均ta.&#xff0c;将tn&#xff0c;tc&#xff0c;ta在控制台输出。 67.数组x中存有20个四位整数&#xff0c;请编制函数…...

pip 与当前python环境版本不匹配, pyenv, pipenv, conda

目录 pip 与当前python环境不匹配解决pip版本不一致 CondaPyenv pip 与当前python环境不匹配 电脑中安装了多个python虚拟环境, 有anaconda创建的虚拟环境,也有pyenv创建的虚拟环境,但是环境变量配置的是anaconda的路径 从而导致在vscode中选择的python版本是3.8.10,而pip却是…...