C++进阶--C++11(04)
文章目录
- C++进阶--C++11(04)
- lambda
- lambda表达式语法
- 捕捉列表
- lambda的应用
- lambda的原理
- 包装器
- function
- bind
- 总结
- 结语
很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!!
今天我们进一步c++11中常见的新增表达
作者:٩( ‘ω’ )و260
我的专栏:Linux,C++进阶,C++初阶,数据结构初阶,题海探骊,c语言
欢迎点赞,关注!!
C++进阶–C++11(04)
在c语言中,我们的可调用对象其实就只有函数
但是在c语言中,指针又会让我们难以掌握。
在之前的c++学习当中,我们学习到了仿函数,这也是一种可调用对象,但是仿函数要求一个类中必须实现operator()并且是公有,倘若我们只用实现一个最普通的加法函数,这样写会不会太杀鸡用牛刀了。显得有点小题大做了。接下来我们将学习lambda表达式,来解决这样的一个问题。
C++11之后,可调用对象就可以分为:函数指针,仿函数,lambda
lambda
lambda表达式语法
1::lambda表达式本质上是一个匿名函数对象,最好定义在函数体内部,因为没有类型,所以最好和auto一起使用。
为什么我们最好定义在内部?因为如果定义在全局,我不如直接写函数或者是仿函数。lambda表达式与其他两个可调用对象最大的区别就是它能够定义在函数内部,并且能够单独开一个自己的作用域。
为什么需要和auto配合使用:因为lambda表达式是一个匿名函数对象,如果我们想要使用这个可调用对象的话,肯定是需要将lambda表达式赋值给一个具体的对象,然后再对这个对象进行操作。
2:lambda表达式格式:
[capture - list] (parameters) -> return type {function boby }
3:[capture-list]:叫做捕捉列表,写在lambda表达式的最前面,编译器根据[ ]来判断接下来的代码是否为 lambda 函数,捕捉列表能够捕捉上下文中的变量供 lambda 函数使用,捕捉列表可以传值和传引用捕捉,下面会讲的更具体一点。即使捕捉列表为空,[ ]也不能省略,因为编译器根据这个来判断是不是lambda表达式的。
4:(parameters):参数列表,与函数中的参数列表类似,可以传引用,也可以传值等等等,如果里面没有传递参数的话,可以和()一起省略掉
5: -> return type:显示说明我的返回值的类型是什么,没有返回值,此时可以省略,如果返回值确定,也可以省略,此时编译器回推导返回值是什么。
6: {function boby }:函数体,更普通函数体类似,函数体是不能被省略的
总结:
可以省略的:返回值类型,参数列表
不能够省略的:捕捉列表,函数体
接下来使用几个示例理解一下:
int main()
{//一个简单的lambda表达式并实施调用auto tmp1 = [](int a, int b)->int {return a + b;};//产生一个可调用对象cout << tmp1(1, 2) << endl;//调用这个可调用对象//注意哪些是可以省略的(2个可以省略,两个不能省略)auto tmp2 = []//产生一个可调用对象{cout << "hello world" << endl;};tmp2();//调用这个可调用对象return 0;
}
捕捉列表
接下来详细说明捕捉列表的作用,什么场景下需要使用到捕捉列表,捕捉列表的格式问题等:
1:如果lambda表达式只能够使用自己作用域的形参或变量,如果想用外部的形参或是变量,就需要进行捕捉。或者是在lambda表达式中,如果局部域中变量频繁被使用,就可以使用捕捉。因为如果显示写参数,到时候传递的话也麻烦,不如直接捕捉。(不用捕捉全局变量,或是静态局部变量,也不需要捕捉,因为局部作用域下是可以使用全局变量的)
2:捕捉方式1(显示捕捉):值捕捉,引用(&)捕捉。如果同时存在,中间用逗号分隔。值捕捉本质上是拷贝构造(类似于传值传参),不能在lambda表达式中对值捕捉的变量进行修改,可以理解为编译器自己加了一个const
[a,&b];//值捕捉和引用捕捉(都是显示捕捉)
3:捕捉方式2(隐式捕捉):=/&捕捉,如果需要将需要的变量进行值捕捉/将需要的变量进行引用捕捉。此时使用=/&。注意,不一定是全部变量,只要lambda表达式中需要的变量才会被捕捉。
[=];//隐式值捕捉
[&];//隐式引用捕捉
4:捕捉方式3:混合捕捉:捕捉方式1和捕捉方式2同时使用。需要满足这些规则:逻辑不能够相矛盾以及顺序问题。
来看一个示例:
[= , a];//逻辑混乱,本身需要的变量已经使用了值捕捉,后面还跟了一个值捕捉
[&, &a];//逻辑混乱
[a, &];//;逻辑正确,但是顺序错误,隐式捕捉必须放在前面
[&a, =];//顺序错误
[&, =];//逻辑错误,到底是隐式值捕捉还是隐式引用捕捉
总结:混合捕捉隐式捕捉必须在前,而且逻辑需正确,前面是隐式值捕捉,后面只能是引用捕捉,前面是隐式引用捕捉,后面只能是值捕捉。
5:lambda表达式定义在局部域中,只能捕捉lambda表达式之前的变量,因为编译器向上查找的原则。定义在全局域中,不用捕捉任何东西,也不需要捕捉,捕捉列表必须为空。
int main()
{int a = 0;auto tmp1 = [a,b](int a, int b)->int{return a + b;};int b = 0;//b不能被捕捉,因为可调用函数向上查找找不到breturn 0;
}
6:默认情况值捕捉过来的变量是被const修饰的,不能被修改,如果想让其被修改,可以使用mutable修饰,但是此时参数列表即使为空,()不能被省略。
int main()
{int a = 0,b = 1;auto tmp1 = [a,&b]()mutable//此时虽然没有参数,但是()是不能够省略的。{a++;//如果去掉了mutable,这句代码是错的,mutable去掉了a的constb++;};return 0;
}
细节:我虽然在lambda表达式中修改了a,但是因为是值捕捉,是局部域中的a拷贝构造给了lambda表达式中的a。对lambda表达式中的a修改的话是不会影响到外面的。
来看示例:
int x = 0;
int main()
{int a = 0, b = 1, c = 2, d = 3;//显示值捕捉auto tmp1 = [a](int x, int y)->int{//a++;//错误代码,a无法被修改return a + x + y;};cout << tmp1(1, 2) << endl;//隐式值捕捉,lambda表达式用到的才去捕捉auto tmp2 = [=]{int ret = 0;ret = a + b + c + d;return ret;};cout << tmp2() << endl;//混合捕捉auto tmp3 = [&]{a++;b++;c++;d++;return a + b + c + d;};cout << tmp3() << endl;static int y = 0;auto tmp4 = []//不能捕捉全局变量和静态局部变量{cout << "hello world" << endl;};tmp3();//mutable去除mutable特性auto tmp5 = [=]()mutable{a++;b--;c++;d--;};tmp5();return 0;
}
lambda的应用
在学习 lambda 表达式之前,我们的使用的可调用对象只有函数指针和仿函数对象,函数指针的类型定义起来比较麻烦,仿函数要定义一个类,相对会比较麻烦。使用 lambda 去定义可调用对象,既简单又方便。
比如在算法库中,sort是一个函数模版,需要实现一个可调用对象来进行排序比较,以前我们是使用的仿函数,但是现在可以使用lambda表达式。
来看示例:
struct Goods{string _name;int _evaluatee;//评分int _price;//价格
}int main()
{vector<Goods> v = { { "苹果", 2.1, 5 }, { "⾹蕉", 3, 4 }, { "橙⼦", 2.2, 3}, { "菠萝", 1.5, 4 } };sort(v.begin(), v.end(), [](const Goods& g1,const Goods& g2){return g1._price < g2._price;});//这里就可以不用再写仿函数传仿函数了,写起来更加方便。return 0;
}
lambda 在很多其他地方用起来也很好用。比如线程中定义线程的执行函数逻辑,智能指针中定制删除器等, lambda 的应用还是很广泛的,以后我们会不断接触到
lambda的原理
1:lambda表达式的底层是仿函数,如果去汇编代码看的话,你会发现和仿函数执行的汇编代码相似。编译器会生成一个类似仿函数的类。
想一下,如果我们都是用lambda表达式,难道编译器生成的类名不可能重复吗,如果重复了,就会造成调用operator()调用的不是我想调的,这该怎么办呢?
编译器底层使用uuid生成字符串作为类名。
这种方式生成相同字符串的概率特别小,比你能中彩票的概率都要小得多,具体可以在网上了解一下uuid,本文不再详细讲解。
2:lambda表达式的参数,返回类型,函数体,就是operator()仿函数的参数,返回类型,函数体。lambda表达式捕捉的本质就是捕捉的内容是operator()的这个类中调用构造函数的实参。即捕获的内容被初始化成员变量的内容了。
来看一下下面的这段代码:
class Rate{
public:Rate(double rate):_rate(rate){}operator()(double money, int year){return _rate*money*year;}
private:double _rate;
};
int main()
{double rate = 0.025;auto tmp1 = [rate](double money,int year){return rate*money*year;};tmp1(10000,10);Rate tmp2(rate);tmp2(10000,10);return 0;
}
包装器
我们先来理解一个点,现在c++11中,可调用对象有三者,分别是函数指针,仿函数,lambda表达式。由于三者的类型不同,我们是不能够将三者存储在一个容器中的,但是c++11有了包装器,就能够做到这一点。
function
被包含在头文件< functional>中
注意:上面的那个是一个模版,但是只是声明,而下面的那个是模版特化的语法,但是这里特化和普通模版的特化有点区别。
std::function是一个包装器,也是一个类模版。
std::function 的实例对象可以包装存储其他的可以调用对象,包括函数指针、仿函数、 lambda 、 bind 表达式等,存储的可调用对象被称为std::function 的目标
为什么function能够包装其他可以调用的对象:
因为function的构造函数重载了函数模版的版本。
我们仔细来查看这个接口,能够发现其中提供了operator接口,如果此时我使用了可调用对象来构造function类,如果再调用operator()接口,就能够直接调用到这个用来构造function类的可调用对象。如果说此时没有使用可调用对象来初始化function,但是调用operator(),调用空std::function 的目标导致抛出std::bad_function_call异常。
function的作用:能够对不同的可调用对象统一它们的类型,方便存取,这样在很多地方就方便声明可调用对象的类型。
我们先来看几个简单的使用function来包装可调用对象:
int f(int x, int y)
{return x + y;
}
struct Functor
{
public:int operator() (int a, int b){return a + b;}
};
int main()
{function<int(int, int)> f1(f);function<int(int, int)> f2 = f;function<int(int, int)> f3 = Functor();auto tmp = [](int a, int b) {return a + b;};function<int(int, int)> f4 = tmp;//此时这三个可调用对象就是同一种类型了,可以将其放入一个容器中vector<function<int(int, int)>> funcv = { f,Functor(),tmp };for (auto& e : funcv){cout << e(10, 20) << endl;}return 0;
}
function包装可调用对象的规则:类型必须和可调用对象一致(包含参数类型,参数个数)…
模版特化的规则:可调用对象的返回值(可调用对象形参数据类型,…)(对应着个数就可以)
使用function类的时候,难的是去包装成员函数,一定要注意,成员函数是有this指针的,所以一定要注意上类型匹配的问题。
来看下面的代码:
class Plus
{
public:Plus(int n = 10):_n(n){}static int plusi(int a, int b){return a + b;}double plusd(double a, double b){return (a + b) * _n;}
private:int _n;
};
int main()
{function<double(Plus*, double, double)> f1 = &Plus::plusd;Plus ps;cout << f1(&ps, 1.1, 2.2) << endl;function<double(Plus, double, double)> f2 = &Plus::plusd;cout << f2(ps, 2.2, 3.3) << endl;function<double(Plus&&, double, double)> f3 = &Plus::plusd;cout << f3(move(ps), 3.3, 4.4) << endl;return 0;
}
注意:普通成员函数还有一个隐含的this指针参数,所以绑定时传对象或者对象的指针过去都可以。
bind
被包含在头文件< functional>中。
bind 是一个函数模板,它也是一个可调用对象的包装器,可以把他看做⼀个函数适配器,对接收的fn可调用对象进行处理后返回一个可调用对象。
bind函数的作用:修改参数的顺序和调整参数个数。
在讲解bind函数作用的时候,我们再来讲解一个类叫placeholders。
形式:auto newCallable = bind(callable,arg_list);
bind也要搭配auto或者function(因为bind也是包装器,可以使用function包装器来接收,但是注意一定类型要匹配)共同使用
newCallable:是bind函数返回的可调用对象(而且第一个一定要传这个)。
callable:是传递的先前已经实现好的可调用对象
arg_list:参数列表(可以手动传递实参,也可写placeholders中的成员变量)。参数列表的顺序最好对应传过来的可调用函数的参数数据类型顺序
placeholders成员变量的作用:
arg_list中的参数可能包含形如_n的名字,其中n是⼀个整数,这些参数是占位符,表示newCallable的参数,它们占据了传递给newCallable的参数的位置。可以理解为:_1始终代表返回的可调用对象的第一个实参,_2始终代表返回的可调用对象的第二个实参,以此类推
来看下例代码:
int Sub(int a, int b)
{return (a - b) * 10;
}
int main()
{ //auto sub1 = bind(Sub, 10, 20);//固定了两个参数,此时实参中不需要传参auto sub1 = bind(Sub, _1, _2);cout << sub1(1, 2) << endl;auto sub1 = bind(Sub, _2, _1);cout << sub1(1, 2) << endl;return 0;
}
这样通过placeholders就完成了对参数顺序的变化,其实这个效果用的很少很少。
接下来来看参数个数的调整:
int Sub(int a, int b)
{return (a - b) * 10;
}
int main()
{ auto sub1 = bind(Sub, 10, 20);//固定了两个参数,此时实参中不需要传参cout << sub1() << endl;auto sub2 = bind(Sub, 10, _1);//固定了一个参数,此时实参中只有传一个参数cout << sub2(10) << endl;auto sub3 = bind(Sub, _1, 10);//固定了一个参数,此时实参中只有传一个参数cout << sub3(10) << endl;return 0;
}
那bind这个用作包装器应用在哪里呢?
在上面,我们是不是发现function包装成员函数的时候由于this指针的影响,导致这个第一个参数传递的是类的指针或者是对象。
所以,这个时候我们绑定第一个类的指针或者是对象,接下来调用可调用对象的时候就不用再来传递类的指针或者是对象了。
来看代码:
function<double(double, double)> f7 = bind(&Plus::plusd, Plus(), _1, _2);
cout << f7(1.1, 1.1) << endl;
所以:bind一般用于:绑死一些参数
总结
今天我们学习了lambda表达式,新增了可调用对象(三个),学习了lambda的语法格式,每一个部分的特点(应该怎么填,哪些可以省略),最重要的就是捕捉列表。具有显示捕捉,隐式捕捉,混合捕捉。并且学习了lambda的底层就仿函数。随后学习了包装器,学习了function细节是什么,格式是什么,怎么写,为什么有这个(统一可调用变量的类型),学习了bind,作用是什么,如何使用,格式是什么
结语
感谢大家阅读我的文章,不足之处欢迎留言指出,感谢大家支持!!
学而不思则罔,思而不学则殆!!
相关文章:

C++进阶--C++11(04)
文章目录 C进阶--C11(04)lambdalambda表达式语法捕捉列表lambda的应用lambda的原理 包装器functionbind 总结结语 很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!! 今天我们进一步c…...

当AI遇上防火墙:新一代智能安全解决方案全景解析
在2025年网络安全攻防升级的背景下,AI与防火墙的融合正重塑安全防御体系。以下三款产品通过机器学习、行为分析等技术创新,为企业提供智能化主动防护: 1. 保旺达数据安全管控平台——AI驱动的动态治理引擎 智能分类分级:基于…...
STL 库基础概念与示例
一、STL 库基础概念与示例 1. 容器分类 顺序容器 核心特性:按元素插入顺序存储,支持下标访问(类似数组),动态扩展内存。典型容器:vector(动态数组)。适用场景:需要频繁…...

Spring MVC参数绑定终极手册:单多参/对象/集合/JSON/文件上传精讲
我们通过浏览器访问不同的路径,就是在发送不同的请求,在发送请求时,可能会带一些参数,本文将介绍了Spring MVC中处理不同请求参数的多种方式 一、传递单个参数 接收单个参数,在Spring MVC中直接用方法中的参数就可以&…...

Fluence推出“Pointless计划”:五种方式参与RWA算力资产新时代
2025年6月1日,去中心化算力平台 Fluence 正式宣布启动“Pointless 计划”——这是其《Fluence Vision 2026》战略中四项核心举措之一,旨在通过贡献驱动的积分体系,激励更广泛的社区参与,为用户带来现实世界资产(RWA&am…...

innovus: ecoAddRepeater改变hier层级解决办法
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 来自星球提问: 星主,我在A/B/C/D/E/U0这个cell后面插入一个BUFF,生成的名字为A/B/C/BUFF1,少了D/E两个层级,不应该是生成A/B/C/…...

华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《硬件产品销售方案》: 目录…...
突破数据孤岛:StarRocks联邦查询实战指南
随着企业数据生态的复杂化,跨多个数据存储系统进行联合查询的需求日益增长。本文将深入解析如何利用StarRocks构建高效的数据联邦查询体系,实现与Apache Doris和Hive数据仓库的无缝对接。 ### 一、StarRocks联邦查询架构解析 StarRocks采用分布式架构设…...

传统业务对接AI-AI编程框架-Rasa的业务应用实战(1)--项目背景即学习初衷
我的初衷:我想学习AI。具体的方向是这样的:原本传统的平台业务去对接智能体。比如发票业务,发票的开具、审核、计税、回款等。根据用户在业务系统前台界面输入若干提示词 或者 语音输入简短语音信息,可以通过智能体给出需要处理的…...

低功耗架构突破:STM32H750 与 SD NAND (存储芯片)如何延长手环续航至 14 天
低功耗架构突破:STM32H750 与 SD NAND (存储芯片)如何延长手环续航至 14 天 卓越性能强化安全高效能效图形处理优势丰富集成特性 模拟模块实时监控保障数据完整性提升安全性与可靠性测量原理采样率相关结束语 在智能皮电手环及数据存储技术不…...
CSS选择子元素
通过选择器 为所有子元素应用样式。以下是几种常见方法: 1. 选择所有直接子元素(不包括孙级) css 复制 下载 .parent > * {/* 样式规则 */color: red; } > 选择器:只匹配直接子元素 * 通配符:匹配任意类型…...
git cherry-pick (28)
1.1 目的 本文档用于说明如何git上,通过cherry-pick命令合并某个功能。 将分支bg_device的 AHB New feature support libalgo arm64 lib 提交内容合并至 分支spfl_device 分支当中 1.2适配步骤 1.2.1 实操过程 > 分支sfpl_device的状态 rootxrootx-ThinkPad:~/workdir…...
android与Qt类比
一、概念对应关系 Android RecyclerView 组件类比描述Qt 模型 - 视图组件Qt 类比描述RecyclerView画板(容器)QAbstractItemView视图(展示数据的容器,如列表、表格)RecyclerView.Adapter画布(数据桥梁&…...
AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片 支持高清CMOS Sensor输入 国产品牌
AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片 支持高清CMOS Sensor输入 国产品牌 产品概述: AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片,支持高清CMOS Sensor输入,经ISP处理、视频前处理以及音视频编…...

Linux(11)——基础IO(上)
目录 一、理解文件 二、回顾C文件的接口 📄 C语言文件操作函数表 编辑📄 三个文件流 三、系统文件I/O 1️⃣open 2️⃣close 3️⃣write 4️⃣read 四、文件描述符 💡用户操作文件的底层逻辑是什么? Ǵ…...

ABP-Book Store Application中文讲解 - Part 9: Authors: User Interface
ABP-Book Store Application中文讲解 - Part 9: Authors: User Interface TBD 1. 汇总 ABP-Book Store Application中文讲解-汇总-CSDN博客 2. 前一章 ABP-Book Store Application中文讲解 - Part 8: Authors: Application Layer-CSDN博客 项目之间的引用关系。 目…...
鸿蒙开发修改版本几个步骤
鸿蒙开发修改版本几个步骤 比如:5.0.4(16)版本改为5.0.2(14)版本 一、项目下的build-profile.json5 "products": [{"name": "default","signingConfig": "default&qu…...

Hive自定义函数案例(UDF、UDAF、UDTF)
目录 前提条件 背景 概念及适用场景 UDF(User-Defined Function) 概念 适用场景 UDAF(User-Defined Aggregate Function) 概念 适用场景 UDTF(User-Defined Table-Generating Function) 概念 适…...

【学习笔记】Circuit Tracing: Revealing Computational Graphs in Language Models
Circuit Tracing: Revealing Computational Graphs in Language Models 替代模型(Replacement Model):用更多的可解释的特征来替代transformer模型的神经元。 归因图(Attribution Graph):展示特征之间的相互影响,能够追踪模型生成输出时所采用…...
3D视觉重构工业智造:解码迁移科技如何用“硬核之眼“重塑生产节拍
一、工业视觉的进化论:从CCD到3D相机的范式革命 在汽车冲压车间里,传统CCD相机正面临四大检测困局: 平面感知局限:二维视觉无法捕捉曲面工件形变环境适应性差:反光板件导致误检率超12%动态捕捉延迟:传送带…...
Elasticsearch中的刷新(Refresh)和刷新间隔介绍
在 Elasticsearch 中,刷新(Refresh) 是控制索引数据何时对搜索可见的机制,而 刷新间隔(Refresh Interval) 则是配置该机制执行频率的参数。理解这两个概念对于平衡搜索实时性与写入性能至关重要。 一、刷新(Refresh)的本质 Lucene 索引结构与搜索可见性Elasticsearch …...

STM32标准库-TIM定时器
文章目录 一、TIM定时器1.1定时器1.2定时器类型1.1.1 高级定时器1.1.2通用定时器1.1.3基本定时器 二、定时中断基本结构预分频器时器计时器时序计数器无预装时序计数器有预装时序RCC时钟树 三、定时器定时中断3.1 接线图3.2代码3.3效果: 四、定时器外部中断4.1接线图…...
【算法训练营Day05】哈希表part1
文章目录 哈希表理论基础有效的字母异位词两个数组的交集快乐数两数之和 哈希表理论基础 几个值得关注的知识点: hash表用于快速的判断元素是否存在(空间换时间)其原理就是将数据通过散列函数映射到bucket中,如果发生hash碰撞&a…...
CMap应用场景和例子
CMap 详解 CMap 是 MFC (Microsoft Foundation Classes) 库中的一个模板类,用于实现键值对的映射关系(类似哈希表或字典)。它提供了高效的数据存储和检索功能,适用于需要通过键快速查找值的场景。 基本模板参数 cpp 运行 tem…...

Kafka 如何保证顺序消费
在消息队列的应用场景中,保证消息的顺序消费对于一些业务至关重要,例如金融交易中的订单处理、电商系统的库存变更等。Kafka 作为高性能的分布式消息队列系统,通过巧妙的设计和配置,能够实现消息的顺序消费。接下来,我…...

【算法题】算法一本通
每周更新至完结,建议关注收藏点赞。 目录 待整理文章已整理的文章方法论思想总结模版工具总结排序 数组与哈希表栈双指针(滑动窗口、二分查找、链表)树前缀树堆 优先队列(区间/间隔问题、贪心 )回溯图一维DP位操作数学…...

Modbus转Ethernet IP赋能挤出吹塑机智能监控
在现代工业自动化领域,小疆智控Modbus转Ethernet IP网关GW-EIP-001与挤出吹塑机的应用越来越广泛。这篇文章将为您详细解读这两者的结合是如何提高生产效率,降低维护成本的。首先了解什么是Modbus和Ethernet IP。Modbus是一种串行通信协议,它…...
C++中如何遍历map?
文章目录 1. 使用范围for循环(C11及以上)2. 使用迭代器3. 使用反向迭代器注意事项 在C中, std::map 是一种关联容器,它存储的是键值对(key-value pairs),并且按键的顺序进行排序。遍历 std::m…...

什么是终端安全管理系统(终端安全管理软件2024科普)
在当今数字化迅速发展的时代,企业面临着越来越多的信息安全威胁。为了应对这些挑战,保障公司数据的安全性和完整性,终端安全管理系统(Endpoint Security Management System)应运而生。 本文将为您深入浅出地科普2024年…...
书籍转圈打印矩阵(8)0604
题目 给定一个整型矩阵matrix,请按照转圈的方式打印它。 例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为:1,2,3ÿ…...