C++进阶--C++11(2)

C++11第一篇

C++11是C++编程语言的一个版本,于2011年发布。C++11引入了许多新特性,为C++语言提供了更强大和更现代化的编程能力。

可变参数模板

在C++11中,可变参数模板可以定义接受任意数量和类型参数的函数模板或类模板。它可以表示0到任意个数,任意类型的参数。通过使用(…)来声明可变参数,省略号后面的参数被称为参数包。

下面是可变参数的函数模板:

// Args是一个模板参数包,args是一个函数形参参数包
// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。
template <class ...Args>
void ShowList(Args... args)
{}

在这里插入图片描述

//展开函数的终止
template<class T>
void Showlist(const T& t)
{cout << t << endl;
}
//可变模板参数
template<class T,class ...Args>
void Showlist(T value, Args... args)
{cout << value << " ";Showlist(args...);
}int main()
{Showlist(1);Showlist(1, 'A');Showlist(1, 'A', std::string("sort"));return 0;
}

在这里插入图片描述

emplace_back()

在这里插入图片描述

测试与push_back()的区别:

int main()
{std::list<fnc::string> lt1;fnc::string s1("xxxx");lt1.push_back(s1);lt1.push_back(move(s1));cout << "=============================================" << endl;fnc::string s2("xxxx");lt1.emplace_back(s2);lt1.emplace_back(move(s2));cout << "=============================================" << endl;lt1.push_back("xxxx");lt1.emplace_back("xxxx");cout << "=============================================" << endl;std::list<pair<fnc::string, fnc::string>> lt2;pair<fnc::string, fnc::string> kv1("xxxx", "yyyy");lt2.push_back(kv1);lt2.push_back(move(kv1));cout << "=============================================" << endl;pair<fnc::string, fnc::string> kv2("xxxx", "yyyy");lt2.emplace_back(kv2);lt2.emplace_back(move(kv2));cout << "=============================================" << endl;lt2.emplace_back("xxxx", "yyyy");cout << "=============================================" << endl;return 0;
}

在这里插入图片描述
再测试:

class Date
{
public:Date(int year=1900, int month=1, int day=1):_year(year), _month(month), _day(day){cout << "Date(int year, int month, int day)" << endl;}Date(const Date& d):_year(d._year), _month(d._month), _day(d._day){cout << "Date(const Date& d)" << endl;}
private:int _year;int _month;int _day;
};int main()
{//直接在参数中插入std::list<Date> lt1;lt1.push_back({ 2024,3,30 });lt1.emplace_back(2024, 3, 30);//直接插入已有的对象cout << endl;Date d1(2023, 1, 1);lt1.push_back(d1);lt1.emplace_back(d1);//插入匿名对象cout << endl;lt1.push_back(Date(2023, 1, 1));lt1.emplace_back(Date(2023, 1, 1));return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

lambda

在这里插入图片描述

lambda语法表达式

[capture-list] (parameters) mutable -> return-type { statement}

  • [capture-list]:捕捉列表:位于lambda表达式最前位置,编译器通过[]来进行判断,能捕捉上下文中的变量给lambda表达式使用;
  • (parameters):参数列表,与函数的参数列表使用一致,如果没有参数的话,可省略使用;
  • mutable:默认情况下,lambda函数是一个const函数,使用mutable可以取消const性。使用该单词,不可省略参数列表。
  • -> return-type :返回值类型,用于声明函数的返回值类型,没有返回值进行省略;一般有返回值也可以省略,通过编译器进行推导。
  • {statement}:函数主体,除了使用参数列表的参数,也可使用捕捉列表的参数。

接下来看lambda的简单使用:

int main()
{//auto add = [](int a, int b)->int{return a + b; };auto add = [](int a, int b) {return a + b; };cout << add(1, 21) << endl;auto swap = [](int& a, int& b){int tmp = a;a = b;b = tmp;};int x = 2, y = 22;swap(x, y);cout << x << " " << y << endl;auto func = []() {cout << "lambda" << endl; };func();return 0;
}

在这里插入图片描述

对上面sort的改装:
在这里插入图片描述

捕捉列表

#include<algorithm>
int main()
{int x = 1, y = 2;auto swap = [&x, &y]()mutable{int tmp = x;x = y;y = tmp;};swap();cout << x << " " << y << endl;int m = 3, n = 4;//传值捕捉'=':捕捉当前域的所有对象auto func1 = [=](){return m * n - x - y;};cout << func1() << endl;//传引用捕捉:捕捉当前域所有对象auto func2 = [&](){x++;y++;return m * n - x - y;};cout << func2() << endl;//x:2,y:3,m:3,n:4//对n传值捕捉,其他的传引用捕捉auto func3 = [&, n](){x++;y++;m++;//n++;错误return m * n - x - y;};cout << func3() << endl;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

lambda底层

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);// lambdaauto r2 = [=](double monty, int year)->double {return monty * rate * year;};r2(10000, 2);auto f1 = [] {cout << "hello world" << endl; };auto f2 = [] {cout << "hello world" << endl; };f1();f2();return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

包装器

为什么要有包装器?

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;// lamber表达式cout << useF([](double d)->double { return d / 4; }, 11.11) << endl;return 0;
}

在这里插入图片描述

类模板:

template <class T> function; // undefinedtemplate <class Ret, class... Args>
class function<Ret(Args...)>;
  • Ret:表示调用函数的返回类型;
  • Args:表示函数的参数列表的参数;

简单对上面例题使用

#include<functional>int main()
{// 函数指针function<double(double)> fc1 = f;fc1(11.11);cout << useF(fc1, 11.11) << endl;// 函数对象function<double(double)> fc2 = Functor();fc2(11.11);cout << useF(fc2, 11.11) << endl;// lambda表达式function<double(double)> fc3 = [](double d)->double { return d / 4; };fc3(11.11);cout << useF(fc3, 11.11) << endl;return 0;
}

在这里插入图片描述

类成员函数

int f(int a, int b)
{return a + b;
}class Plus
{
public:static int plusi(int a, int b){return a + b;}double plusd(double a, double b){return a + b;}
};int main()
{// 普通函数function<int(int, int)> fc1 = f;cout << fc1(1, 1) << endl;// 静态成员函数function<int(int, int)> fc2 = &Plus::plusi;cout << fc2(1, 1) << endl;// 非静态成员函数// 非静态成员函数需要对象的指针或者对象去进行调用function<double(Plus, double, double)> fc3 = &Plus::plusd;cout << fc3(Plus(), 1, 1) << endl;return 0;
}

在这里插入图片描述

bind

在C++中,bind是一个函数模板,位于<functional>头文件中,用于创建函数对象(也称为函数绑定器),可以将参数绑定到函数调用中。

bind函数的语法如下:

template< class Fn, class... Args >
bind( Fn&& fn, Args&&... args );

其中,Fn表示要绑定的函数或可调用对象,Args表示要绑定的参数。

使用bind函数可以实现函数的延迟调用、固定部分参数等功能。

简单使用

int Sub(int a, int b)
{return a - b;
}class Plus
{
public:static int plusi(int a, int b){return a + b;}double plusd(double a, double b){return a - b;}
};int main()
{// 调整参数顺序int x = 10, y = 20;cout << Sub(x, y) << endl;auto f1 = bind(Sub, placeholders::_2, placeholders::_1);cout << f1(x, y) << endl;function<double(Plus, double, double)> fc3 = &Plus::plusd;cout << fc3(Plus(), 1, 1) << endl;// 调整参数的个数// 某些参数绑死function<double(double, double)> fc4 = bind(&Plus::plusd, Plus(), placeholders::_1, placeholders::_2);cout << fc4(2, 3) << endl;function<double(double)> fc5 = bind(&Plus::plusd, Plus(), placeholders::_1, 20);cout << fc5(2) << endl;return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于swagger配置

swagger有多种样式&#xff0c;有些比较难用&#xff0c;如下界面比较友好 1.推荐对应的jar包如下 <!--swagger相关--> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0<…

MYSQL 锁机制 与 MVCC多版本并发

MYSQL锁机制与优化以及MVCC底层原理 锁分类 乐观锁&#xff0c;悲观锁 从性能上分为乐观锁&#xff08;版本对比,版本一致就更新&#xff0c;不一致就不更新或CAS机制&#xff09;和悲观锁&#xff08;锁住资源等待&#xff09;&#xff0c;乐观锁适合读比较多的场景&#x…

Go 程序的启动流程【1/2】

Go 程序的启动流程 本文将以一个简单的 HelloWorld 程序为例&#xff0c;探究 Go 程序的启动流程 package mainfunc main() {_ "Hello World" }入口 我们先通过 go build . 将代码编译成可执行文件&#xff0c;众所周知&#xff0c;我们在一个 shell 中执行可执行…

jenkins+docker实现可持续自动化部署springboot项目

目录 一、前言 二、微服务带来的挑战 2.1 微服务有哪些问题 2.2 微服务给运维带来的挑战 三、可持续集成与交付概述 3.1 可持续集成与交付概念 3.1.1 持续集成 3.1.2 持续交付 3.1.3 可持续集成与交付核心理念 3.2 可持续集成优点 3.3 微服务为什么需要可持续集成 四…

echart 仪表盘实现指针的渐变色及添加图片

需求&#xff1a; 在仪表盘中设置指针为渐变色&#xff0c;并在仪表盘中间添加图片。 实现重点&#xff1a; 1、仪表盘指针渐变色的实现 渐变色通过设置pointer的itemStyle属性内的color实现&#xff0c;重点是echart版本&#xff0c;这个原本使用4.8.0的版本不起作用&#xff…

【Linux】环境基础开发工具使用——gcc/g++使用

Linux编译器-gcc/g使用 1. 背景知识 1. 预处理&#xff08;进行宏替换 ) 2. 编译&#xff08;生成汇编 ) 3. 汇编&#xff08;生成机器可识别代码&#xff09; 4. 连接&#xff08;生成可执行文件或库文件 ) 2. gcc如何完成 格式 gcc [ 选项 ] 要编译的文件 [ 选…

【Java+Springboot】----- 通过Idea快速创建SpringBoot项目操作方法

一、第一步&#xff1a; 点击选择【File】->【New】-> 【Project】 最后弹出[new Project]界面。 二、第二步&#xff1a; 1. 选择【Spring Initializr】 2. 然后选择【Project SDK】的版本 3. 然后 Choose Initializr Service URL 选择默认&#xff08;Default&#x…

降低笔记本电脑噪音的七种方法,看下有没有适合你的

序言 无论是玩游戏、浏览网络还是做严肃的工作,差不多都有这么一台笔记本电脑,它有足够的处理能力来处理几乎任何事情。不幸的是,它可能会变得非常大声,但有办法来遏制这种噪音。 清洁通风口和风扇,并使用硬表面 如果你的笔记本电脑现在比过去运行同样的软件时声音更大…

基于Springboot+Vue实现前后端分离社团管理系统

一、&#x1f680;选题背景介绍 &#x1f4da;推荐理由&#xff1a; 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;将计算机运用于社团管理也是十分常见的。过去使用手工的管理方式对大学生社团进行管理&#xff0c;造成了管理繁琐、难以维护等…

迷茫下是自我提升

长夜漫漫&#xff0c;无心睡眠。心中所想&#xff0c;心中所感&#xff0c;忧愁当前&#xff0c;就执笔而下&#xff0c;写下这篇文章。 回忆过往 回想当初为啥学前端&#xff0c;走前端这条路&#xff0c;学校要求嘛&#xff0c;兴趣爱好嘛&#xff0c;还是为了钱。 时间带着…

服务效率飙升!2024最新Zoho Desk功能解析

2024年&#xff0c;立足于服务经济浪潮&#xff0c;如何为您的客户提供优质服务&#xff0c;高效解决客户工单&#xff0c;赢得客户美誉度&#xff0c;是当下各行企业的着力点。 在企业中&#xff0c;与客户发生最直接接触的就是客户服务部门。规范化客服部门业务流程&#xf…

顺序表相关习题

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…